home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 23 code / QuickTime Music / Music 2.1 Temp.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-03  |  67.8 KB  |  2,116 lines  |  [TEXT/KAHL]

  1. /*
  2.      File:        InstrumentFormat.h
  3.  
  4.      Contains:    xxx put contents here xxx
  5.  
  6.      Version:    
  7.  
  8.      DRI:        
  9.  
  10.      Copyright:    © 1984-1994 by Apple Computer, Inc.
  11.                  All rights reserved.
  12.  
  13.      Warning:    *** APPLE INTERNAL USE ONLY ***
  14.                  This file may contain unreleased API's
  15.  
  16.      BuildInfo:    Built by:            QuickTime
  17.                  With Interfacer:    1.1d11  
  18.                  From:                InstrumentFormat.i
  19.                      Revision:        4
  20.                      Dated:            6/23/95
  21.                      Last change by:    GMA
  22.                      Last comment:    InstKnobList was typedef'd twice causing rs6000 to choke.
  23.  
  24.      Bugs:        Report bugs to Radar component “System Interfaces”, “Latest”
  25.                  List the version information (from above) in the Problem Description.
  26.  
  27. */
  28.  
  29. #ifndef __INSTRUMENTFORMAT__
  30. #define __INSTRUMENTFORMAT__
  31.  
  32.  
  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif
  36.  
  37. #if GENERATINGPOWERPC
  38. #pragma options align=mac68k
  39. #endif
  40.  
  41. #ifdef __CFM68K__
  42. #pragma import on
  43. #endif
  44.  
  45.  
  46. #ifndef __TYPES__
  47. #include <Types.h>
  48. #endif
  49. /*    #include <ConditionalMacros.h>                                */
  50.  
  51. #ifndef __SOUND__
  52. #include <Sound.h>
  53. #endif
  54. /*    #include <MixedMode.h>                                        */
  55.  
  56. enum {
  57. /*    kfiFlatInstrumentType     = 'fi',*/
  58.     kfiToneDescType                = 'td',
  59.     kfiKnobListType                = 'kl',
  60.     kfiSampleInfoType            = 'si',
  61.     kfiPitchInfoType            = 'pi',
  62.     kfiSampleDescType            = 'sd',
  63.     kfiLoopInfoType                = 'li',
  64.     kfiInstInfoType                = 'ii',
  65.     kfiPictType                    = 'ip',
  66.     kfiAuthorType                = 'ia',
  67.     kfiCopyrightType            = 'ic',
  68.     kfiOtherStrType                = 'io',
  69.     kfiSampleDataType            = 'dt',
  70.     kfiNoteRequestInfoType        = 'nr'
  71. };
  72.  
  73. struct InstKnobRec {
  74.     long                            number;
  75.     long                            value;
  76. };
  77. typedef struct InstKnobRec InstKnobRec;
  78.  
  79.  
  80. enum {
  81.     kInstKnobMissingUnknown        = 0,
  82.     kInstKnobMissingDefault        = 1 << 0
  83. };
  84.  
  85. struct InstKnobList {
  86.     long                            knobCount;
  87.     long                            knobFlags;
  88.     InstKnobRec                        knob[1];
  89. };
  90. typedef struct InstKnobList InstKnobList;
  91.  
  92. struct SamplePitchInfoRec {
  93.     long                            pitch;
  94.     long                            low;
  95.     long                            high;
  96. };
  97. typedef struct SamplePitchInfoRec SamplePitchInfoRec;
  98.  
  99.  
  100. enum {
  101.     instSamplePreProcessFlag    = 1 << 0
  102. };
  103.  
  104. struct InstSampleDescRec {
  105.     OSType                            dataFormat;
  106.     short                            numChannels;
  107.     short                            sampleSize;
  108.     UnsignedFixed                    sampleRate;
  109.     short                            sampleDataID;
  110.     long                            offset;                        /* offset within SampleData - this could be just for internal use*/
  111.     long                            numSamples;                    /* this could also just be for internal use, we'll see*/
  112. };
  113. typedef struct InstSampleDescRec InstSampleDescRec;
  114.  
  115.  
  116. enum {
  117.     loopTypeNormal                = 0,
  118.     loopTypeAlternating            = 1                                /* back & forth*/
  119. };
  120.  
  121. struct LoopInfoRec {
  122.     long                            loopType;
  123.     long                            loopStart;
  124.     long                            loopEnd;
  125. };
  126. typedef struct LoopInfoRec LoopInfoRec;
  127.  
  128. typedef Handle AtomicInstrument;
  129.  
  130. typedef Ptr AtomicInstrumentPtr;
  131.  
  132. /*∑#ifndef forMasterInterfaces*/
  133.  
  134. #ifdef __CFM68K__
  135. #pragma import off
  136. #endif
  137.  
  138. #if GENERATINGPOWERPC
  139. #pragma options align=reset
  140. #endif
  141.  
  142. #ifdef __cplusplus
  143. }
  144. #endif
  145.  
  146. #endif /* __INSTRUMENTFORMAT__ */
  147.  
  148. //∑#ifndef forMasterInterfaces
  149. /*
  150.     File:        MusicComponent.i
  151.  
  152.     Copyright:    © 1991-1995 by Apple Computer, Inc., all rights reserved.
  153.  
  154.     This file is used in these builds: Warhol
  155.  
  156.     Change History (most recent first):
  157.  
  158.        <71+>     6/27/95    dvb        various
  159.         <71>     6/27/95    JB        Added back obsolete routines for compatability
  160.         <70>     6/22/95    JB        removed comments which confused .i generation
  161.         <69>     6/21/95    JB        Added knobID to knobDescription && changed parm names to
  162.                                     knobIndex & knobID
  163.         <68>     6/18/95    JB        remove comment to satisfy interfacer
  164.         <67>     6/16/95    JB        SetFlatInstrument is gone, gone, gone
  165.         <66>     6/14/95    JB        first installment of new AtomicInstruments && put synthtypes
  166.                                     here
  167.         <65>      9-5-95    dvb        
  168.         <64>     28-4-95    dvb        calls for component-based MIDI output
  169.         <63+> calls for component based midi ports (such as macwavemaker and pas-16)
  170.         <63>      6-4-95    dvb        alter editinst api, add getnoterequest call
  171.         <62>     3/28/95    JB        Interfacer hates typedef enum
  172.         <61>     24-3-95    dvb        gap constants
  173.         <60>     14-3-95    dvb        values for reserved field of midipacket.
  174.         <59>      6-1-95    dvb        Settings
  175.         <58>    22-12-94    dvb        New knob types
  176.         <57>    12/19/94    JLN        New knob selectors for user interface
  177.         <56>     7-12-94    dvb        more synthesizer flags
  178.         <55>    11/23/94    JB        unsigned char ==> UInt8 in two structs
  179.         <54>    24-10-94    dvb        "default knob value
  180.         <53>     7-10-94    dvb        synthType should be synthesizerType, to match other names
  181.         <52>     10/4/94    JB        make build
  182.         <51>     10/3/94    JB        New Universal Interfaces
  183.         <47>     7/20/94    dvb        nubus support calls
  184.         <46>     6/24/94    PH        still trying to generate valid public interfaces
  185.         <45>     6/21/94    PH        header files were inconsistent betwixt public and private
  186.                                     headers
  187.         <44>     6/15/94    JB        Remove Get/SetInstruments from public interface
  188.         <43>      6/9/94    dvb        remove a call or two.
  189.         <42>      6/4/94    dvb        FlatInstrument noodling
  190.         <41>     5/29/94    dvb        error code
  191.         <40>     5/24/94    dvb        MinorGroupStart bit in knobs
  192.         <39>     5/23/94    dvb        more bits
  193.         <38>     5/13/94    dvb        Removed some dead calls, and such. Changed drumkit number.
  194.         <37>      5/6/94    dvb        Redefined InstrumentDataHandle, added more knob types.
  195.         <36>     4/14/94    dvb        Remove MIDI Mgr calls from music components, to Note Allocator
  196.         <35>      4/8/94    dvb        Instrument About…
  197.         <34+>     3/28/94    dvb        Instrument About…
  198.         <34>     3/28/94    dvb        Various BW fixes
  199.         <33>      3/9/94    dvb        SetTuning selector
  200.         <32>      3/7/94    JB        …
  201.         <31>      3/7/94    JB        …
  202.         <30>      3/7/94    JB        PowerInterfacer sucks!
  203.         <29>      3/6/94    JB        UniversalHeaders changed CallComponentNow
  204.         <28>      3/4/94    JB        changes for music into QTcomponents.h
  205.         <27>      3/1/94    dvb        Flat Instrument
  206.         <26>     2/28/94    JLN        change definition of kKnobRealtime
  207.         <25>     12/6/93    dvb        Standard Sample Format
  208.         <24>     11/5/93    dvb        New calls, controllers
  209.         <23+>     11/4/93    dvb        Make error codes of form, 0x8000••••.
  210.         <23>     11/3/93    dvb        Header error in GetController
  211.         <22>    10/20/93    dvb        Add kKnobFlags for type description of knobs.
  212.         <21>     10/1/93    dvb        Remove some detritus.
  213.         <20>     9/10/93    dvb        GM Instrument Bits unsigned
  214.         <19>     8/27/93    dvb        Make knobs sensible. Packed instrument format eliminates the
  215.                                     need for calls to operate on an instrument.
  216.         <18+>     8/24/93    dvb        Make knobs sensible. Packed instrument format
  217.                                     eliminates the need for calls to operate on an
  218.                                     instrument.
  219.         <18>     8/24/93    dvb        Redo the whole midi channel stuff. Make shorts into longs.
  220.         <17>     7/12/93    dvb        Wrong selector on Music Set Instruments.
  221.         <16>     6/30/93    dvb        //∑ #ifdef
  222.         <15>     6/18/93    dvb        Calls specific to Generic MIDI component.
  223.         <14>     1/15/93    dvb        Microtones R Us.
  224.        <12+>    12/17/92    dvb        More errors.
  225.        <11+>     11/9/92    dvb        Pan controller definition.
  226.         <10>    10/26/92    dvb        Synthesizer flags.
  227.         <8+>     9/17/92    dvb        Controllers are ±7.8 fixed point.
  228.          <8>     9/14/92    dvb        Made controllers signed 8.8.
  229.         <6+>      9/3/92    dvb        Redefine controllers in a safe & sane fashion.
  230.          <6>     8/28/92    dvb        Drum support.
  231.         <4+>      8/3/92    dvb        Revise some more.
  232.          <4>     7/13/92    dvb        Device knobs, & change how controllers work (a little).
  233.          <3>      7/7/92    dvb        
  234.         <1+>     6/29/92    dvb        New and improved.
  235.  
  236. -----
  237. Used to be "MIDIComponent.h"
  238.  
  239.         <7+>     6/29/92    dvb        Make it better.
  240.          <7>     6/23/92    dvb        Mine.
  241.          <6>      6/1/92    dvb        New tone definition
  242.          <5>     4/22/92    dvb        More.
  243.          <4>     4/16/92    dvb        More calls.
  244.          <3>      4/3/92    dvb        Expand, to allow for non-MIDI note-players, and note commands.
  245.          <2>      7/5/91    dvb        Just hackin.
  246.  
  247.     To Do:
  248. */
  249.  
  250. //∑#endif forMasterInterfaces
  251.  
  252. //∑#ifndef forMasterInterfaces
  253. #ifndef __Music__
  254. #define __Music__
  255. //∑#endif forMasterInterfaces
  256.  
  257. #include <Movies.h>
  258.  
  259.  
  260.  
  261. enum {
  262.     kMusicComponentType        = 'musi'
  263. };
  264.  
  265. enum {
  266.     kSoftSynthType        = 'ss  ',
  267.     kGMSynthType        = 'gm  '
  268. };
  269.  
  270.  
  271. typedef ComponentInstance MusicComponent;
  272.  
  273. // MusicSynthesizerFlags
  274. enum {
  275.     kSynthesizerDynamicVoice = 1,            /* can assign voices on the fly (else, polyphony is very important */
  276.     kSynthesizerUsesMIDIPort = 2,            /* must be patched through MIDI Manager */
  277.     kSynthesizerMicrotone = 4,                /* can play microtonal scales */
  278.     kSynthesizerLimitedMicrotone = 8,        /* can play microtones, but only on 1-voice parts */
  279.     kSynthesizerMixedDrums = 16,            /* any part can play drum parts, total = instrument parts */
  280.     kSynthesizerSoftware = 32,                /* implemented in main CPU software == uses cpu cycles */
  281.     kSynthesizerHardware = 64,                /* is a hardware device (such as nubus, or maybe DSP?) */
  282.     kSynthesizerDynamicChannel = 128,        /* can move any part to any channel or disable each part. (else we assume it lives on all channels in masks) */
  283.     kSynthesizerHogsSystemChannel = 256,    /* can be channelwise dynamic, but always responds on its system channel */
  284.     kSynthesizerEditsMainChannel = 512,        /* can only twiddle knobs on the main system channel */
  285.     kSynthesizerSlowSetPart = 1024,            /* SetPart() and SetInstrumentNumber() calls do not have rapid response, may glitch notes */
  286.  
  287.     kSynthesizerNeedsSystemChannel = 2048,    /* The user need not be queried for system channel, example: GM synth */
  288.     kSynthesizerCanBeMono = 4096,            /* Synthesizer can be configured either mono or poly */
  289.  
  290.     kSynthesizerGMSuperset = 8192,            /* synth is a GM device, with some voices beyond the GM set. (if set, kSynthesizerGM must also be set */
  291.     kSynthesizerGM = 16384                    /* synth is a GM device */
  292. };
  293.  
  294. /*
  295.  * Note that these controller numbers
  296.  * are _not_ identical to the MIDI controller numbers.
  297.  * These are _signed_ 8.8 values, and the LSB's are
  298.  * always sent to a MIDI device. Controllers 32-63 are
  299.  * reserved (for MIDI, they are LSB's for 0-31, but we
  300.  * always send both).
  301.  *
  302.  * The full range, therefore, is -128.00 to 127.7f.
  303.  *
  304.  * _Excepting_ _volume_, all controls default to zero.
  305.  *
  306.  * Pitch bend is specified in fractional semitones! No
  307.  * more "pitch bend range" nonsense. You can bend as far
  308.  * as you want, any time you want.
  309.  */
  310. enum MusicControllers {
  311.     kControllerModulationWheel = 1,
  312.     kControllerBreath = 2,
  313.     kControllerFoot = 4,
  314.     kControllerPortamentoTime = 5,    /* portamento on/off is omitted, 0 time = 'off' */
  315.     kControllerVolume = 7,
  316.     kControllerBalance = 8,
  317.     kControllerPan = 10,            /* 0 - "default", 1 - n: positioned in output 1-n (incl fractions) */
  318.     kControllerExpression = 11,
  319.     kControllerLever1 = 16,            /* general purpose controllers */
  320.     kControllerLever2 = 17,            /* general purpose controllers */
  321.     kControllerLever3 = 18,            /* general purpose controllers */
  322.     kControllerLever4 = 19,            /* general purpose controllers */
  323.     kControllerLever5 = 80,            /* general purpose controllers */
  324.     kControllerLever6 = 81,            /* general purpose controllers */
  325.     kControllerLever7 = 82,            /* general purpose controllers */
  326.     kControllerLever8 = 83,            /* general purpose controllers */
  327.     kControllerPitchBend = 32,        /* positive & negative semitones, with 7 bits fraction */
  328.     kControllerAfterTouch = 33,        /* aka channel pressure */
  329.     kControllerSustain = 64,        /* boolean - positive for on, 0 or negative off */
  330.     kControllerSostenuto = 66,        /* boolean */
  331.     kControllerSoftPedal = 67,        /* boolean */
  332.     kControllerReverb = 91,
  333.     kControllerTremolo = 92,
  334.     kControllerChorus = 93,
  335.     kControllerCeleste = 94,
  336.     kControllerPhaser = 95
  337. };
  338.  
  339. enum {
  340.     kControllerMaximum = 0x7FFF,        /* +01111111.11111111 */
  341.     kControllerMinimum = 0x8000            /* -10000000.00000000 */
  342. };
  343.  
  344. struct SynthesizerDescription {
  345.     OSType synthesizerType;                /* synthesizer type (must be same as component subtype) */
  346.     Str31 name;                            /* text name of synthesizer type */
  347.     unsigned long flags;                /* from the above enum */
  348.     unsigned long voiceCount;            /* maximum polyphony */
  349.  
  350.     unsigned long partCount;            /* maximum multi-timbrality (and midi channels) */
  351.     unsigned long instrumentCount;                /* non gm, built in (rom) instruments only */
  352.     unsigned long modifiableInstrumentCount;    /* plus n-more are user modifiable */
  353.     unsigned long channelMask;            /* (midi device only) which channels device always uses */
  354.  
  355.     unsigned long drumPartCount;        /* maximum multi-timbrality of drum parts */
  356.     unsigned long drumCount;            /* non gm, built in (rom) drumkits only */
  357.     unsigned long modifiableDrumCount;    /* plus n-more are user modifiable */
  358.     unsigned long drumChannelMask;        /* (midi device only) which channels device always uses */
  359.  
  360.     unsigned long outputCount;            /* number of audio outputs (usually two) */
  361.     unsigned long latency;                /* response time in µSec */
  362.  
  363.     unsigned long controllers[4];                /* array of 128 bits */
  364.     unsigned long gmInstruments[4];                /* array of 128 bits */
  365.     unsigned long gmDrums[4];                    /* array of 128 bits */
  366. };
  367. typedef struct SynthesizerDescription SynthesizerDescription;
  368.  
  369.  
  370. enum {
  371.     kVoiceCountDynamic = -1                /* constant to use to specify dynamic voicing */
  372. };
  373.  
  374.  
  375. struct ToneDescription {
  376.     OSType synthesizerType;                /* synthesizer type */
  377.     Str31 synthesizerName;                /* name of instantiation of synth */
  378.     Str31 instrumentName;                /* preferred name for human use */
  379.     long instrumentNumber;                /* inst-number used if synth-name matches */
  380.     long gmNumber;                        /* Best matching general MIDI number */
  381.     };
  382. typedef struct ToneDescription ToneDescription;
  383.  
  384. enum {
  385.     kFirstDrumkit = 16384,                /* (first value is "no drum". instrument numbers from 16384->16384+128 are drumkits, and for GM they are _defined_ drumkits! */
  386.     kLastDrumkit = (kFirstDrumkit+128)
  387. };
  388.  
  389. // InstrumentMatch
  390. enum {
  391.     kInstrumentMatchSynthesizerType = 1,
  392.     kInstrumentMatchSynthesizerName = 2,
  393.     kInstrumentMatchName = 4,
  394.     kInstrumentMatchNumber = 8,
  395.     kInstrumentMatchGMNumber = 16
  396.     };
  397.  
  398. // KnobFlags
  399. enum {
  400.     kKnobRealtime = 1,                    /* Knob can be changed interactively as part of a sequence (ie knob can be changed at interrupt time) */
  401.     kKnobNextNote = 2,                    /* Knob only takes effect on the next note played */
  402.     kKnobAction = 4,                    /* setting the knob does something immediate */
  403.     kKnobNotInstrument = 8,                /* indicates that the knob isn't in the instrument handle */
  404.     kKnobAffectsOthers = 16,            /* other knobs will change value from this one */
  405.     kKnobInterruptUnsafe = 32,            /* only alter this knob from foreground task time (may access toolbox) */ 
  406.     kKnobMinorGroupStart = 64,            /* knob is first in some logical subgroup of knobs */
  407.     kKnobGroupStart = 128,                /* knob is first in some logical group of knobs */
  408.  
  409.     kKnobFixedPoint8 = 1024,
  410.     kKnobFixedPoint16 = 2048,
  411.  
  412.     /* One of these may be used at a time. */
  413.     kKnobTypeNumber = 0<<12,
  414.     kKnobTypeGroupName = 1<<12,            /* "knob" is really a group name for display purposes */
  415.     kKnobTypeBoolean = 2<<12,            /* if range is greater than 1, its a multi-checkbox field */
  416.     kKnobTypeNote = 3<<12,                /* knob range is equivalent to MIDI keys */
  417.     kKnobTypePan = 4<<12,                /* range goes left/right (lose this? ) */
  418.     kKnobTypeInstrument = 5<<12,        /* knob value = reference to another instrument number */
  419.     kKnobTypeSetting = 6<<12,            /* knob value is 1 of n different things (eg, fm algorithms) popup menu */
  420.     kKnobTypeMilliseconds = 7<<12,        /* knob is a millisecond time range */
  421.     kKnobTypePercentage = 8<<12,        /* knob range is displayed as a Percentage */
  422.     kKnobTypeHertz = 9<<12                /* knob represents frequency */
  423.     };
  424.  
  425.  
  426. enum {
  427.     kUnknownKnobValue = 0x7FFFFFFF,        /* a knob with this value means, we don't know it. */
  428.     kDefaultKnobValue = 0x7FFFFFFE        /* used to SET a knob to its default value. */
  429. };
  430.  
  431. struct KnobDescription {
  432.     Str31 name;
  433.     long lowValue;
  434.     long highValue;
  435.     long defaultValue;                    /* a default instrument is made of all default values */
  436.     long flags;
  437.     long knobID;
  438. };
  439. typedef struct KnobDescription KnobDescription;
  440.  
  441.  
  442. #ifndef forMasterInterfaces
  443.     struct InstrumentData {
  444.         ToneDescription tone;
  445.         long knobCount;
  446.         long knob[1];
  447.     };
  448.     typedef struct InstrumentData InstrumentData, **InstrumentDataHandle;
  449.  
  450.  
  451. struct obsFlatInstrument {
  452.     ToneDescription tone;
  453.     long size;                            /* size in bytes of the following data, including size field (excluding tonedescription) */
  454. #ifdef forMasterInterfaces
  455.     packed
  456. #endif forMasterInterfaces
  457.     UInt8 data[4];
  458. };
  459. typedef struct obsFlatInstrument obsFlatInstrument;
  460. #endif forMasterInterfaces
  461.  
  462. struct InstrumentAboutInfo {
  463.     PicHandle p;
  464.     Str255 author;
  465.     Str255 copyright;
  466.     Str255 other;
  467. };
  468. typedef struct InstrumentAboutInfo InstrumentAboutInfo;
  469.  
  470.  
  471. enum
  472.     {
  473.     kMusicPacketPortLost = 1,    /* received when application loses the default input port */
  474.     kMusicPacketPortFound,        /* received when application gets it back out from under someone else's claim */
  475.     kMusicPacketTimeGap            /* data[0] = number of milliseconds to keep the MIDI line silent */
  476.     };
  477.  
  478. struct MusicMIDIPacket {
  479.     unsigned short length;
  480.     unsigned long reserved;        /* if length zero, then reserved = above enum */
  481. #ifdef forMasterInterfaces
  482.     packed
  483. #endif forMasterInterfaces
  484.     UInt8 data[249];
  485. };
  486. typedef struct MusicMIDIPacket MusicMIDIPacket;
  487.  
  488. typedef pascal ComponentResult (*MusicMIDISendProcPtr)(MusicComponent self,long refCon,MusicMIDIPacket *mmp);
  489. enum {
  490.     uppMusicMIDISendProcInfo = kPascalStackBased
  491.         | RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
  492.         | STACK_ROUTINE_PARAMETER(0, SIZE_CODE(sizeof(MusicComponent)))
  493.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
  494.         | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(MusicMIDIPacket *)))
  495. };
  496.  
  497. #if USESROUTINEDESCRIPTORS
  498. typedef UniversalProcPtr MusicMIDISendUPP;
  499.  
  500. #define CallMusicMIDISendProc(userRoutine, self, refCon, mmp)    \
  501.     CallUniversalProc((UniversalProcPtr)(userRoutine), uppMusicMIDISendProcInfo, (self), (refCon), (mmp))
  502. #define NewMusicMIDISendProc(userRoutine)    \
  503.     (MusicMIDISendUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppMusicMIDISendProcInfo, GetCurrentISA())
  504. #else
  505. typedef MusicMIDISendProcPtr MusicMIDISendUPP;
  506.  
  507. #define CallMusicMIDISendProc(userRoutine, self, refCon, mmp)    \
  508.     (*(userRoutine))((self), (refCon), (mmp))
  509. #define NewMusicMIDISendProc(userRoutine)    \
  510.     (MusicMIDISendUPP)(userRoutine)
  511. #endif
  512.  
  513. #pragma UPPSuite emitUPPTypes
  514.  
  515. typedef pascal ComponentResult (*MusicMIDIReadHookProcPtr)(MusicMIDIPacket *mp, long myRefCon);
  516. enum {
  517.     uppMusicMIDIReadHookProcInfo = kPascalStackBased
  518.         | RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
  519.         | STACK_ROUTINE_PARAMETER(0, SIZE_CODE(sizeof(MusicMIDIPacket *)))
  520.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
  521. };
  522.  
  523. #if USESROUTINEDESCRIPTORS
  524. typedef UniversalProcPtr MusicMIDIReadHookUPP;
  525.  
  526. #define CallMusicMIDIReadHookProc(userRoutine, mp, myRefCon)    \
  527.     CallUniversalProc((UniversalProcPtr)(userRoutine), uppMusicMIDIReadHookProcInfo, (mp), (myRefCon))
  528. #define NewMusicMIDIReadHookProc(userRoutine)    \
  529.     (MusicMIDIReadHookUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppMusicMIDIReadHookProcInfo, GetCurrentISA())
  530. #else
  531. typedef MusicMIDIReadHookProcPtr MusicMIDIReadHookUPP;
  532.  
  533. #define CallMusicMIDIReadHookProc(userRoutine, mp, myRefCon)    \
  534.     (*(userRoutine))((mp), (myRefCon))
  535. #define NewMusicMIDIReadHookProc(userRoutine)    \
  536.     (MusicMIDIReadHookUPP)(userRoutine)
  537. #endif
  538.  
  539. #pragma UPPSuite emitUPPTypes
  540.  
  541.  
  542. /*--------------------------------*/
  543.  
  544.  
  545. enum
  546.     {
  547.     kMusicFirstSelect = 0,
  548.     kMusicGetDescriptionSelect,
  549.     kMusicGetPartSelect,
  550.     kMusicSetPartSelect,
  551.     kMusicSetInstrumentNumberSelect,
  552.     kMusicGetInstrumentNumberSelect,
  553.     kMusicStoreInstrumentSelect,
  554.     kMusicGetInstrumentSelect,
  555.     kMusicSetInstrumentSelect,
  556.  
  557.     kMusicGetAtomicInstrumentSelect,
  558.     kMusicSetAtomicInstrumentSelect,
  559.     kMusicDummyThree,
  560.     kMusicDummyFour,
  561.  
  562.     kMusicGetInstrumentKnobDescriptionObsoleteSelect,
  563.     kMusicGetDrumKnobDescriptionObsoleteSelect,
  564.     kMusicGetKnobDescriptionObsoleteSelect,
  565.  
  566.     kMusicGetPartKnobSelect,
  567.     kMusicSetPartKnobSelect,
  568.     kMusicGetKnobSelect,
  569.     kMusicSetKnobSelect,
  570.  
  571.     kMusicGetPartNameSelect,
  572.     kMusicSetPartNameSelect,
  573.  
  574.     kMusicFindToneSelect,
  575.  
  576.     kMusicPlayNoteSelect,
  577.     kMusicResetPartSelect,
  578.     kMusicSetControllerSelect,
  579.     kMusicGetControllerSelect,
  580.  
  581.     kMusicGetMIDIProcSelect,
  582.     kMusicSetMIDIProcSelect,
  583.  
  584.     kMusicGetInstrumentNamesSelect,
  585.     kMusicGetDrumNamesSelect,
  586.  
  587.     kMusicGetMasterTuneSelect,
  588.     kMusicSetMasterTuneSelect,
  589.  
  590.     kMusicDummyFive,
  591.  
  592.     kMusicGetInstrumentAboutInfoSelect,
  593.  
  594.     kMusicGetDeviceConnectionSelect,
  595.     kMusicUseDeviceConnectionSelect,
  596.  
  597.     kMusicGetInstrumentKnobSettingsSelect,
  598.  
  599.     kMusicGetMIDIPortsSelect,
  600.     kMusicSendMIDISelect,
  601.     kMusicReceiveMIDISelect,
  602.  
  603.     kMusicStartNonRealTimeSelect,
  604.     kMusicSetNonRealTimeToSelect,
  605.  
  606.     kMusicGetInstrumentKnobDescriptionSelect,
  607.     kMusicGetDrumKnobDescriptionSelect,
  608.     kMusicGetKnobDescriptionSelect
  609.  
  610. };
  611.  
  612.  
  613. //∑#ifndef forMasterInterfaces
  614. #define MusicError(x) (0x80000000 | ((unsigned short)(-2100 - x)) )
  615. //∑#endif forMasterInterfaces
  616.  
  617. enum {
  618.     notImplementedMusicErr            = MusicError(1),
  619.     cantSendToSynthesizerErr        = MusicError(2),
  620.     cantReceiveFromSynthesizerErr    = MusicError(3),
  621.     illegalVoiceAllocationErr        = MusicError(4),
  622.     illegalPartErr                    = MusicError(5),
  623.     illegalChannelErr                = MusicError(6),
  624.     illegalKnobErr                    = MusicError(7),
  625.     illegalKnobValueErr                = MusicError(8),
  626.     illegalInstrumentErr            = MusicError(9),
  627.  
  628.     illegalControllerErr            = MusicError(10),
  629.     midiManagerAbsentErr            = MusicError(11),
  630.     synthesizerNotRespondingErr        = MusicError(12),
  631.     synthesizerErr                    = MusicError(13),
  632.     illegalNoteChannelErr            = MusicError(14),
  633.     noteChannelNotAllocatedErr        = MusicError(15),
  634.     tunePlayerFullErr                = MusicError(16),
  635.     tuneParseErr                    = MusicError(17)
  636. };
  637.  
  638. enum {
  639.     kGMType = 'gm  '                    /* subtype for General MIDI music component */
  640. };
  641.  
  642.  
  643. /*-----------------------------------------
  644.     Capabilities and Voice Allocation
  645. -----------------------------------------*/
  646.  
  647. pascal ComponentResult
  648. MusicGetPart (MusicComponent mc, long part,
  649.         long *midiChannel, long *polyphony)
  650.         ComponentCallNow(kMusicGetPartSelect,12);
  651.  
  652. pascal ComponentResult
  653. MusicSetPart (MusicComponent mc, long part,
  654.         long midiChannel, long polyphony)
  655.         ComponentCallNow(kMusicSetPartSelect,12);
  656.  
  657.  
  658. pascal ComponentResult
  659. MusicGetDescription ( MusicComponent mc, SynthesizerDescription *sd )
  660.         ComponentCallNow(kMusicGetDescriptionSelect,4);
  661.  
  662.  
  663. pascal ComponentResult
  664. MusicGetInstrumentAboutInfo(MusicComponent mc,long part, InstrumentAboutInfo *iai)
  665.         ComponentCallNow(kMusicGetInstrumentAboutInfoSelect,8);
  666.  
  667. /*-----------------------------------------
  668.     Instrument Loading and Storing
  669. -----------------------------------------*/
  670. pascal ComponentResult
  671. MusicSetInstrumentNumber(MusicComponent mc,long part, long instrumentNumber)
  672.         ComponentCallNow(kMusicSetInstrumentNumberSelect,8);
  673.  
  674. pascal ComponentResult
  675. MusicGetInstrumentNumber(MusicComponent mc,long part)
  676.         ComponentCallNow(kMusicGetInstrumentNumberSelect,4);
  677.  
  678. pascal ComponentResult
  679. MusicStoreInstrument(MusicComponent mc,long part, long instrumentNumber)
  680.         ComponentCallNow(kMusicStoreInstrumentSelect,8);
  681.  
  682. #if 0
  683. pascal ComponentResult
  684. MusicGetInstrument(MusicComponent mc,long part, InstrumentDataHandle *iH)
  685.         ComponentCallNow(kMusicGetInstrumentSelect,8);
  686.  
  687. pascal ComponentResult
  688. MusicSetInstrument(MusicComponent mc,long part, InstrumentDataHandle iH)
  689.         ComponentCallNow(kMusicSetInstrumentSelect,8);
  690. #endif
  691.  
  692. enum {
  693.     getAtomicInstGetOriginalSamples = 1<<0,
  694.     getAtomicInstGetExpandedSamples = 1<<1
  695. };
  696.  
  697. pascal ComponentResult
  698. MusicGetAtomicInstrument(MusicComponent mc, long part, AtomicInstrument *ai, long flags)
  699.         ComponentCallNow(kMusicGetAtomicInstrumentSelect,12);
  700.  
  701. enum {
  702.     setAtomicInstKeepOriginalSamples = 1<<0,
  703.     setAtomicInstNeverPurgeSamples = 1<<1        // if set self-contained inst stays until app goes away 
  704. };
  705.  
  706. pascal ComponentResult
  707. MusicSetAtomicInstrument(MusicComponent mc, long part, AtomicInstrumentPtr aiP, long flags)
  708.         ComponentCallNow(kMusicSetAtomicInstrumentSelect,12);
  709.  
  710. /*-----------------------------------------
  711.     Instrument Knobs
  712. -----------------------------------------*/
  713.  
  714. pascal ComponentResult
  715. MusicGetInstrumentKnobDescription(MusicComponent mc, 
  716.         long knobIndex, KnobDescription *mkd)
  717.         ComponentCallNow(kMusicGetInstrumentKnobDescriptionSelect,8);
  718.  
  719. pascal ComponentResult
  720. MusicGetDrumKnobDescription(MusicComponent mc, 
  721.         long knobIndex, KnobDescription *mkd)
  722.         ComponentCallNow(kMusicGetDrumKnobDescriptionSelect,8);
  723.  
  724. pascal ComponentResult
  725. MusicGetInstrumentKnobSettings(MusicComponent mc,
  726.         long knobIndex,Handle *settingsNames,
  727.         Handle *settingsCategoryLasts,Handle *settingsCategoryNames)
  728.         ComponentCallNow(kMusicGetInstrumentKnobSettingsSelect,16);
  729.  
  730. pascal ComponentResult
  731. MusicGetPartKnob(MusicComponent mc,
  732.         long part,long knobID)
  733.         ComponentCallNow(kMusicGetPartKnobSelect,8);
  734.  
  735. pascal ComponentResult
  736. MusicSetPartKnob(MusicComponent mc,
  737.         long part,long knobID, long knobValue)
  738.         ComponentCallNow(kMusicSetPartKnobSelect,12);
  739.  
  740.  
  741. /*-----------------------------------------
  742.     Synthesizer Knobs
  743. -----------------------------------------*/
  744.  
  745. pascal ComponentResult
  746. MusicGetKnobDescription(MusicComponent mc, 
  747.         long knobIndex, KnobDescription *mkd)
  748.         ComponentCallNow(kMusicGetKnobDescriptionSelect,8);
  749.  
  750. pascal ComponentResult
  751. MusicGetKnob(MusicComponent mc,
  752.         long knobID)
  753.         ComponentCallNow(kMusicGetKnobSelect,4);
  754.  
  755. pascal ComponentResult
  756. MusicSetKnob(MusicComponent mc,
  757.         long knobID, long knobValue)
  758.         ComponentCallNow(kMusicSetKnobSelect,8);
  759.  
  760. pascal ComponentResult
  761. MusicSetMasterTune(MusicComponent mc,long masterTune)
  762.         ComponentCallNow(kMusicSetMasterTuneSelect,4);
  763.  
  764. pascal ComponentResult
  765. MusicGetMasterTune(MusicComponent mc)
  766.         ComponentCallNow(kMusicGetMasterTuneSelect,0);
  767.  
  768.  
  769.  
  770. /*-----------------------------------------
  771.     Names of Instruments
  772. -----------------------------------------*/
  773.  
  774. pascal ComponentResult
  775. MusicGetPartName(MusicComponent mc, long part, Str31 name)
  776.         ComponentCallNow(kMusicGetPartNameSelect,8);
  777.  
  778. pascal ComponentResult
  779. MusicSetPartName(MusicComponent mc, long part, Str31 name)
  780.         ComponentCallNow(kMusicSetPartNameSelect,8);
  781.  
  782. pascal ComponentResult
  783. MusicFindTone(MusicComponent mc, ToneDescription *td,
  784.         long *instrumentNumber, unsigned long *fit)
  785.         ComponentCallNow(kMusicFindToneSelect,12);
  786.  
  787.  
  788. enum
  789.     {
  790.     kInstrumentNamesModifiable = 1,
  791.     kInstrumentNamesBoth = 2
  792.     };
  793.  
  794. pascal ComponentResult
  795. MusicGetInstrumentNames(MusicComponent mc, long modifiableInstruments,
  796.         Handle *instrumentNames,
  797.         Handle *instrumentCategoryLasts,
  798.         Handle *instrumentCategoryNames)
  799.         ComponentCallNow(kMusicGetInstrumentNamesSelect,16);
  800.  
  801. pascal ComponentResult
  802. MusicGetDrumNames(MusicComponent mc,
  803.         long modifiableInstruments,
  804.         Handle *instrumentNumbers,
  805.         Handle *instrumentNames)
  806.         ComponentCallNow(kMusicGetDrumNamesSelect,12);
  807.  
  808.  
  809. /*-----------------------------------------
  810.     Realtime Actions
  811. -----------------------------------------*/
  812.  
  813. pascal ComponentResult
  814. MusicPlayNote(MusicComponent mc, long part, long pitch, long velocity)
  815.         ComponentCallNow(kMusicPlayNoteSelect,12);
  816.  
  817. pascal ComponentResult
  818. MusicResetPart(MusicComponent mc, long part)
  819.         ComponentCallNow(kMusicResetPartSelect,4);
  820.  
  821. pascal ComponentResult
  822. MusicSetController(MusicComponent mc, long part,
  823.         long controllerNumber,long controllerValue)
  824.         ComponentCallNow(kMusicSetControllerSelect,12);
  825.  
  826. pascal ComponentResult
  827. MusicGetController(MusicComponent mc, long part,
  828.         long controllerNumber)
  829.         ComponentCallNow(kMusicGetControllerSelect,8);
  830.  
  831. /*-----------------------------------------
  832.     Finding the Hardware
  833. -----------------------------------------*/
  834.  
  835.  
  836. pascal ComponentResult
  837. MusicGetMIDIProc(MusicComponent mc, MusicMIDISendUPP *midiSendProc, long *refCon)
  838.         ComponentCallNow(kMusicGetMIDIProcSelect,8);
  839.  
  840. pascal ComponentResult
  841. MusicSetMIDIProc(MusicComponent mc, MusicMIDISendUPP midiSendProc, long refCon)
  842.         ComponentCallNow(kMusicSetMIDIProcSelect,8);
  843.  
  844. pascal ComponentResult
  845. MusicGetDeviceConnection(MusicComponent mc,long index,long *id1,long *id2)
  846.         ComponentCallNow(kMusicGetDeviceConnectionSelect,12);
  847.  
  848. pascal ComponentResult
  849. MusicUseDeviceConnection(MusicComponent mc,long id1,long id2)
  850.         ComponentCallNow(kMusicUseDeviceConnectionSelect,8);
  851.  
  852.  
  853.  
  854. /*-----------------------------------------
  855.     Component Based MIDIs
  856.     (very optional calls)
  857. -----------------------------------------*/
  858. pascal ComponentResult MusicGetMIDIPorts(MusicComponent mc,
  859.         long *inputPortCount,long *outputPortCount)
  860.         ComponentCallNow(kMusicGetMIDIPortsSelect,8);
  861.  
  862. pascal ComponentResult MusicSendMIDI(MusicComponent mc,
  863.         long portIndex,MusicMIDIPacket *mp)
  864.         ComponentCallNow(kMusicSendMIDISelect,8);
  865.  
  866. pascal ComponentResult MusicReceiveMIDI(MusicComponent mc,
  867.         MusicMIDIReadHookUPP readHook,long refCon)
  868.         ComponentCallNow(kMusicReceiveMIDISelect,8);
  869.  
  870.  
  871.  
  872. /*-----------------------------------------
  873.     Non-RealTime Support
  874. -----------------------------------------*/
  875.  
  876. typedef pascal ComponentResult (*MusicNonRealTimeDataProcPtr)(Ptr SoundData, long numBytes, long myRefCon);
  877. enum {
  878.     uppMusicNonRealTimeDataProcInfo = kPascalStackBased
  879.         | RESULT_SIZE(SIZE_CODE(sizeof(ComponentResult)))
  880.         | STACK_ROUTINE_PARAMETER(0, SIZE_CODE(sizeof(Ptr)))
  881.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
  882.         | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
  883. };
  884.  
  885. #if USESROUTINEDESCRIPTORS
  886. typedef UniversalProcPtr MusicNonRealTimeDataUPP;
  887.  
  888. #define CallMusicNonRealTimeDataProc(userRoutine, SoundData, numBytes, myRefCon)    \
  889.     CallUniversalProc((UniversalProcPtr)(userRoutine), uppMusicNonRealTimeDataProcInfo, (SoundData), (numBytes), (myRefCon))
  890. #define NewMusicNonRealTimeDataProc(userRoutine)    \
  891.     (MusicNonRealTimeDataUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppMusicNonRealTimeDataProcInfo, GetCurrentISA())
  892. #else
  893. typedef MusicNonRealTimeDataProcPtr MusicNonRealTimeDataUPP;
  894.  
  895. #define CallMusicNonRealTimeDataProc(userRoutine, SoundData, numBytes, myRefCon)    \
  896.     (*(userRoutine))((SoundData), (numBytes), (myRefCon))
  897. #define NewMusicNonRealTimeDataProc(userRoutine)    \
  898.     (MusicNonRealTimeDataUPP)(userRoutine)
  899. #endif
  900.  
  901. #pragma UPPSuite emitUPPTypes
  902.  
  903. struct NonRealTimeSampleType {
  904.     unsigned long                    numChannels;                /*number of channels,  ie mono = 1*/
  905.     UnsignedFixed                    sampleRate;                    /*sample rate in Apples Fixed point representation*/
  906.     unsigned short                    sampleSize;                    /*number of bits in sample*/
  907. };
  908. typedef struct NonRealTimeSampleType NonRealTimeSampleType;
  909.  
  910. pascal ComponentResult MusicStartNonRealTime(MusicComponent mc,
  911.         unsigned long *numChannels, UnsignedFixed *sampleRate, unsigned short *sampleSize,
  912.         MusicNonRealTimeDataUPP dataProc, long dataProcRefCon)
  913.         ComponentCallNow(kMusicStartNonRealTimeSelect,20);
  914.  
  915. pascal ComponentResult MusicSetNonRealTimeTo(MusicComponent mc,
  916.         long newTimeStamp )
  917.         ComponentCallNow(kMusicSetNonRealTimeToSelect,4);
  918.  
  919.  
  920.  
  921. /*-----------------------------------------
  922.     Obsolete calls
  923. -----------------------------------------*/
  924.  
  925. pascal ComponentResult
  926. MusicGetInstrumentKnobDescriptionObsolete(MusicComponent mc, 
  927.         long knobIndex, void *mkd)
  928.         ComponentCallNow(kMusicGetInstrumentKnobDescriptionObsoleteSelect,8);
  929.  
  930. pascal ComponentResult
  931. MusicGetDrumKnobDescriptionObsolete(MusicComponent mc, 
  932.         long knobIndex, void *mkd)
  933.         ComponentCallNow(kMusicGetDrumKnobDescriptionObsoleteSelect,8);
  934.  
  935. pascal ComponentResult
  936. MusicGetKnobDescriptionObsolete(MusicComponent mc, 
  937.         long knobIndex, void *mkd)
  938.         ComponentCallNow(kMusicGetKnobDescriptionObsoleteSelect,8);
  939.  
  940.  
  941. //∑#ifndef forMasterInterfaces
  942. #endif __Music__
  943. //∑#endif forMasterInterfaces
  944.  
  945. //∑#ifndef forMasterInterfaces
  946. /*
  947.     File:        NoteAllocatorComponent.h
  948.  
  949.     Written by:    dvb
  950.  
  951.     Copyright:    © 1992-1995 by Apple Computer, Inc., all rights reserved.
  952.  
  953.     Change History (most recent first):
  954.  
  955.         <58>     6/27/95    dvb        Remove MusicGetInstrument and instrumenthandles
  956.         <57>     6/16/95    JB        remove SetFlatInstrument calls
  957.         <56>     6/14/95    JB        First installment of Atomic Instruments
  958.         <55>      9-5-95    dvb        dead pickinst params are now longs
  959.         <54+> make dead PickInst params into longs
  960.         <54>     28-4-95    dvb        new port type, of QT
  961.         <53+> allow component-based MIDI ports
  962.         <53>      4/6/95    PH        change what david said so it builds again
  963.         <52>      6-4-95    dvb        remove old editinst, pickEdit supercedes. NAGetNoteRequest
  964.         <51>      4-4-95    dvb        edit from picker
  965.         <50>     20-2-95    dvb        NASendMIDI() call
  966.         <49>     2/16/95    JB        fix non-def of privateNoteChannel for MasterInterfaces
  967.         <48>     30-1-95    dvb        New editinst routine
  968.         <47>     1/11/95    PH        build w/ think c
  969.         <46>    19-12-94    dvb        Support for storing user instruments.
  970.         <45+>     add flags to NoteRequest
  971.         <45>     9-12-94    dvb        Support for non-midi-mgr midi ports.
  972.         <44+>     7-12-94    dvb        Support for non-midi-mgr midi ports
  973.         <44>     7-12-94    dvb        
  974.         <43>     9-11-94    dvb        
  975.         <42+> NAPlayNote2    a playnote command with time & duration, for GetState purposes
  976.         <42>    24-10-94    dvb        Note channel state
  977.         <41>    14-10-94    dvb        New query call
  978.         <40>     10/3/94    JB        New Universal Interfaces
  979.         <39>     27-9-94    dvb        nubus support
  980.         <38>     8/24/94    JB        typedef enum -> enum
  981.         <37>     7/20/94    dvb        hardware synth support
  982.         <36>      6/4/94    dvb        Flat instruments and instruments.
  983.         <35>      6/3/94    dvb        Include refCon in PickInstrument
  984.         <34>     5/29/94    dvb        
  985.         <33>     4/20/94    dvb        Make 'GetStatusBlock' unbounded.
  986.         <32>     4/15/94    dvb        Copyright Dialog
  987.         <31>     4/14/94    dvb        Remove MIDI Mgr calls from music components, to Note Allocator
  988.        <29+>      4/1/94    dvb        Dont require midi.h
  989.         <29>      3/9/94    dvb        kNoteAllocatorType
  990.         <28>      3/6/94    JB        PowerInterfacer sucks && UniversalHeaders changed
  991.                                     CallComponentNow
  992.         <27>      3/5/94    dvb        Another picker flag
  993.         <26>      3/4/94    JB        ProcPtr -> UPPs
  994.         <25>      3/4/94    dvb        Add more parameters to Instrument Picker .
  995.         <24+>     2/20/94    dvb        Arrangement Dialog Interface again!
  996.         <24>     2/20/94    dvb        Arrangement Dialog Interface again!
  997.         <23>     2/20/94    dvb        Arrangement Dialog
  998.         <22>     2/14/94    dvb        Fix arrange dialog
  999.         <21>     2/14/94    dvb        Easy connection to MIDI input.
  1000.         <20>     12/6/93    dvb        Default MIDI Input port.
  1001.        <18+>     10/6/93    dvb        Make types OSType
  1002.         <18>     8/24/93    dvb        Fix selectors
  1003.         <17>     8/18/93    dvb        Selector bugs (bw), remove inhibit call, jive with
  1004.                                     MusicComponent.h
  1005.         <16>      7/9/93    dvb        Take out lame macros that I thought were so cool.
  1006.        <14+>     6/28/93    dvb        //∑ #ifdef to create public header file.
  1007.         <14>     6/28/93    dvb        
  1008.        <12+>     3/12/93    dvb        Allocator Status Call.
  1009.         <12>     1/15/93    dvb        Fast Dispatch
  1010.        <10+>    12/17/92    dvb        Bad argument size on preroll
  1011.         <9+>    11/20/92    dvb        Call to save configuration.
  1012.         <8+>     8/31/92    dvb        Typical Polyphony
  1013.          <8>     8/28/92    dvb        Better call set.
  1014.         <6+>     8/15/92    dvb        Allow releasing of channels...
  1015.         <5+>     7/24/92    dvb        Volume control from movie controller
  1016.          <5>     7/13/92    dvb        Add in instrument-picker dialog
  1017.         <3+>     6/29/92    dvb        Get the instrument you want.
  1018.         <2+>     6/25/92    dvb        Put global-stuff into sys heap.
  1019.          <2>     6/23/92    dvb        Pascal routines, dummyhead
  1020.          <1>     6/22/92    dvb        first checked in
  1021. */
  1022.  
  1023. /*
  1024.  * P U B L I C   I N T E R F A C E   F O R   N O T E   A L L O C A T O R
  1025.  */
  1026.  
  1027.  
  1028.  
  1029. #ifndef _NoteAllocator_
  1030. #define _NoteAllocator_
  1031.  
  1032. /*--------------------------
  1033.     Inclusions
  1034. --------------------------*/
  1035.  
  1036.  
  1037.  
  1038. //∑#endif forMasterInterfaces
  1039.  
  1040. /*--------------------------
  1041.     Types
  1042. --------------------------*/
  1043.  
  1044. //∑#ifndef forMasterInterfaces
  1045. #ifndef privateNoteAllocator
  1046. //∑#endif forMasterInterfaces
  1047.  
  1048.  
  1049. #ifdef forMasterInterfaces
  1050. #pragma output notC
  1051. typedef void *NoteChannel;
  1052.  
  1053. #pragma output c
  1054. struct NoteChannelRecord {
  1055.     long data[1];
  1056. };
  1057. typedef struct NoteChannelRecord NoteChannelRecord, *NoteChannel;
  1058. #pragma output all
  1059. #endif forMasterInterfaces
  1060. #ifndef forMasterInterfaces
  1061. typedef struct privateNoteChannel *NoteChannel;
  1062. #endif forMasterInterfaces
  1063.  
  1064. //∑#ifndef forMasterInterfaces
  1065. #endif privateNoteAllocator
  1066. //∑#endif forMasterInterfaces
  1067.  
  1068. enum {
  1069.     kSynthesizerConnectionMono = 1,        /* if set, and synth can be mono/poly, then the partCount channels from the system channel are hogged */
  1070.     kSynthesizerConnectionMMgr = 2,        /* this connection imported from the MIDI Mgr */
  1071.     kSynthesizerConnectionOMS = 4,        /* this connection imported from OMS */
  1072.     kSynthesizerConnectionQT = 8        /* this connection is a QuickTime-only port */
  1073. };
  1074.  
  1075. /* used for MIDI device only */
  1076. struct SynthesizerConnections {
  1077.     OSType clientID;
  1078.     OSType inputPortID;                    /* terminology death: this port is used to SEND to the midi synth */
  1079.     OSType outputPortID;                /* terminology death: this port receives from a keyboard or other control device */
  1080.     long midiChannel;                    /* The system channel; others are configurable (or the nubus slot number) */
  1081.     long flags;
  1082.     long unique;                    /* unique id may be used instead of index, to getinfo and unregister calls */
  1083.     long reserved1;                    /* should be zero */
  1084.     long reserved2;                    /* should be zero */
  1085. };
  1086. typedef struct SynthesizerConnections SynthesizerConnections;
  1087.  
  1088. struct QTMIDIPort {
  1089.     SynthesizerConnections portConnections;
  1090.     Str63 portName;
  1091. };
  1092. typedef struct QTMIDIPort QTMIDIPort;
  1093.     
  1094. #define kNoteRequestNoGM 1            /* dont degrade to a GM synth */
  1095. #define kNoteRequestNoSynthType 2    /* dont degrade to another synth of same type but different name */
  1096.  
  1097. struct NoteRequestInfo {
  1098.     UInt8 flags;            /* 1: dont accept GM match, 2: dont accept same-synth-type match */
  1099.     UInt8 reserved;            /* must be zero */
  1100.     short polyphony;        /* Maximum number of voices */
  1101.     Fixed typicalPolyphony;    /* Hint for level mixing */
  1102. };
  1103. typedef struct NoteRequestInfo NoteRequestInfo;
  1104.  
  1105. struct NoteRequest {
  1106.     NoteRequestInfo info;
  1107.     ToneDescription tone;
  1108. };
  1109. typedef struct NoteRequest NoteRequest;
  1110.  
  1111.  
  1112.  
  1113. enum {
  1114.     kNAFirstSelector = -7,
  1115.  
  1116.     kNATargetSelect,
  1117.     kNARegisterSelect,
  1118.     kNAVersionSelect,
  1119.     kNACanDoSelect,
  1120.     kNACloseSelect,
  1121.     kNAOpenSelect,
  1122.  
  1123.     kNARegisterMusicDeviceSelect,
  1124.     kNAUnregisterMusicDeviceSelect,
  1125.     kNAGetRegisteredMusicDeviceSelect,
  1126.     kNASaveMusicConfigurationSelect,
  1127.     kNANewNoteChannelSelect,
  1128.     kNADisposeNoteChannelSelect,
  1129.     kNAGetNoteChannelInfoSelect,
  1130.     kNAPrerollNoteChannelSelect,
  1131.     kNAUnrollNoteChannelSelect,
  1132.     kNAEngageNoteChannelSelect,
  1133.     kNADisengageNoteChannelSelect,
  1134.     kNASetNoteChannelVolumeSelect,
  1135.     kNAResetNoteChannelSelect,
  1136.     kNAPlayNoteSelect,
  1137.     kNASetControllerSelect,
  1138.     kNASetKnobSelect,
  1139.     kNAFindNoteChannelToneSelect,
  1140.     kNASetNoteChannelInstrumentSelect,
  1141.     kNAPickInstrumentSelect,
  1142.     kNAPickArrangementSelect,
  1143.     kNAGetStatusBlockSelect,
  1144.     kNASetDefaultMIDIInputSelect,
  1145.     kNAGetDefaultMIDIInputSelect,
  1146.     kNAGetNoteChannelStateSelect,
  1147.     kNASetNoteChannelStateSelect,
  1148.     kNAUseDefaultMIDIInputSelect,
  1149.     kNALoseDefaultMIDIInputSelect,
  1150.  
  1151.     kNAStuffToneDescriptionSelect,
  1152.  
  1153.     kNACopyrightDialogSelect,
  1154.  
  1155.     kNADummyOneSelect,
  1156.     kNADummyTwoSelect,
  1157. //    kNASetInstrumentSelect,
  1158.     kNAGetIndNoteChannelSelect,
  1159.  
  1160.     kNAPlayNote2Select,
  1161.  
  1162.     kNAGetMIDIPortsSelect,
  1163.     kNAGetNoteRequestSelect,
  1164.     kNASendMIDISelect,
  1165.     kNAPickEditInstrumentSelect,
  1166.  
  1167.     kNANewNoteChannelFromInstrumentSelect,
  1168.     kNASetAtomicInstrumentSelect,
  1169.  
  1170.     kNALastSelector
  1171.     };
  1172.  
  1173. #ifndef forMasterInterfaces
  1174. #undef NAComponentCall
  1175. #undef NAComponentError
  1176. #endif forMasterInterfaces
  1177.  
  1178. typedef ComponentInstance NoteAllocator;
  1179.  
  1180. enum {
  1181.     kPickDontMix = 1,            /* dont mix instruments with drum sounds */
  1182.     kPickSameSynth = 2,            /* only allow the same device that went in, to come out */
  1183.     kPickUserInsts = 4,            /* show user insts in addition to ROM voices */
  1184.  
  1185.     kPickEditAllowEdit = 8,        /* lets user switch over to edit mode */
  1186.     kPickEditAllowPick = 16,    /* lets the user switch over to pick mode */
  1187.     kPickEditSynthGlobal = 32,    /* edit the global knobs of the synth */
  1188.     kPickEditControllers = 64    /* edit the controllers of the notechannel */
  1189. };
  1190.  
  1191.  
  1192. enum {
  1193.     kNoteAllocatorType = 'nota'
  1194. };
  1195.  
  1196. /*--------------------------------
  1197.     Note Allocator Prototypes
  1198. --------------------------------*/
  1199.  
  1200. /*
  1201.  * System Configuration
  1202.  */
  1203. pascal ComponentResult NARegisterMusicDevice(NoteAllocator na,
  1204.         OSType synthType,Str31 name,SynthesizerConnections *connections)
  1205.         ComponentCallNow(kNARegisterMusicDeviceSelect,12);
  1206. pascal ComponentResult NAUnregisterMusicDevice(NoteAllocator na,
  1207.         long index)
  1208.         ComponentCallNow(kNAUnregisterMusicDeviceSelect,4);
  1209.  
  1210. pascal ComponentResult NAGetRegisteredMusicDevice(NoteAllocator na,
  1211.         long index,
  1212.         OSType *synthType,Str31 name,SynthesizerConnections *connections,
  1213.         MusicComponent *mc)
  1214.         ComponentCallNow(kNAGetRegisteredMusicDeviceSelect,20);
  1215.  
  1216. pascal ComponentResult NASetDefaultMIDIInput(NoteAllocator na,
  1217.         SynthesizerConnections *sc)
  1218.         ComponentCallNow(kNASetDefaultMIDIInputSelect,4);
  1219.  
  1220. pascal ComponentResult NAGetDefaultMIDIInput(NoteAllocator na,
  1221.         SynthesizerConnections *sc)
  1222.         ComponentCallNow(kNAGetDefaultMIDIInputSelect,4);
  1223.         
  1224.  
  1225. pascal ComponentResult NASaveMusicConfiguration(NoteAllocator na)
  1226.         ComponentCallNow(kNASaveMusicConfigurationSelect,0);
  1227.  
  1228. /*
  1229.  * Allocation
  1230.  */
  1231. pascal ComponentResult NANewNoteChannel(NoteAllocator na,
  1232.         NoteRequest *noteRequest,NoteChannel *outChannel)
  1233.         ComponentCallNow(kNANewNoteChannelSelect,8);
  1234.  
  1235. pascal ComponentResult NANewNoteChannelFromInstrument(NoteAllocator na,
  1236.         AtomicInstrumentPtr instrument,NoteChannel *outChannel)
  1237.         ComponentCallNow(kNANewNoteChannelFromInstrumentSelect,8);
  1238.  
  1239. pascal ComponentResult NADisposeNoteChannel(NoteAllocator na,NoteChannel noteChannel)
  1240.         ComponentCallNow(kNADisposeNoteChannelSelect,4);
  1241.  
  1242. pascal ComponentResult NAGetNoteChannelInfo(NoteAllocator na,NoteChannel noteChannel,
  1243.         long *index,long *part)
  1244.         ComponentCallNow(kNAGetNoteChannelInfoSelect,12);
  1245.  
  1246. pascal ComponentResult NAGetNoteRequest(NoteAllocator na,NoteChannel noteChannel,
  1247.         NoteRequest *nrOut)
  1248.         ComponentCallNow(kNAGetNoteRequestSelect,8);
  1249.  
  1250. pascal ComponentResult NAUseDefaultMIDIInput(NoteAllocator na,MusicMIDIReadHookUPP readHook,long refCon,unsigned long flags)
  1251.         ComponentCallNow(kNAUseDefaultMIDIInputSelect,12);
  1252.  
  1253. pascal ComponentResult NALoseDefaultMIDIInput(NoteAllocator na)
  1254.         ComponentCallNow(kNALoseDefaultMIDIInputSelect,0);
  1255.  
  1256. pascal ComponentResult NAGetMIDIPorts(NoteAllocator na,
  1257.         Handle *inputPorts,Handle *outputPorts)
  1258.         ComponentCallNow(kNAGetMIDIPortsSelect,8);
  1259.  
  1260. /*
  1261.  * Setup
  1262.  */
  1263. pascal ComponentResult NAPrerollNoteChannel(NoteAllocator na,
  1264.         NoteChannel noteChannel)
  1265.         ComponentCallNow(kNAPrerollNoteChannelSelect,4);
  1266.  
  1267. pascal ComponentResult NAUnrollNoteChannel(NoteAllocator na,
  1268.         NoteChannel noteChannel)
  1269.         ComponentCallNow(kNAUnrollNoteChannelSelect,4);
  1270.  
  1271. pascal ComponentResult NAEngageNoteChannel(NoteAllocator na,
  1272.         NoteChannel noteChannel)
  1273.         ComponentCallNow(kNAEngageNoteChannelSelect,4);
  1274.  
  1275. pascal ComponentResult NADisengageNoteChannel(NoteAllocator na,
  1276.         NoteChannel noteChannel, long silenceNotes)
  1277.         ComponentCallNow(kNADisengageNoteChannelSelect,8);
  1278.  
  1279. pascal ComponentResult NAGetNoteChannelState(NoteAllocator na,
  1280.         NoteChannel noteChannel,
  1281.         long instrumentNumber, TimeValue t,Handle *state)
  1282.         ComponentCallNow(kNAGetNoteChannelStateSelect,16);
  1283.  
  1284. pascal ComponentResult NASetNoteChannelState(NoteAllocator na,
  1285.         NoteChannel noteChannel,
  1286.         long instrumentNumber, unsigned long *state)
  1287.         ComponentCallNow(kNASetNoteChannelStateSelect,12);
  1288.  
  1289. pascal ComponentResult NAResetNoteChannel(NoteAllocator na,NoteChannel noteChannel)
  1290.         ComponentCallNow(kNAResetNoteChannelSelect,4);
  1291.  
  1292. pascal ComponentResult     NASetNoteChannelVolume(NoteAllocator na,
  1293.         NoteChannel noteChannel, Fixed volume)
  1294.         ComponentCallNow(kNASetNoteChannelVolumeSelect,8);
  1295.  
  1296. #if 0
  1297. pascal ComponentResult NASetInstrument(NoteAllocator na,
  1298.         NoteChannel noteChannel, InstrumentData *instrumentData)
  1299.         ComponentCallNow(kNASetInstrumentSelect,8);
  1300. #endif
  1301.  
  1302. pascal ComponentResult NASetAtomicInstrument(NoteAllocator na,
  1303.         NoteChannel noteChannel,AtomicInstrumentPtr instrument,long flags)
  1304.         ComponentCallNow(kNASetAtomicInstrumentSelect,12);
  1305.  
  1306.  
  1307.  
  1308. /*
  1309.  * Control
  1310.  */
  1311. pascal ComponentResult NAPlayNote(NoteAllocator na,NoteChannel noteChannel,long pitch,long velocity)
  1312.         ComponentCallNow(kNAPlayNoteSelect,12);
  1313.  
  1314. pascal ComponentResult NAPlayNote2(NoteAllocator na,NoteChannel noteChannel,long pitch,long velocity,TimeValue offTime)
  1315.         ComponentCallNow(kNAPlayNote2Select,16);
  1316.  
  1317. pascal ComponentResult NASetController(NoteAllocator na,
  1318.         NoteChannel noteChannel, long controllerNumber,long controllerValue)
  1319.          ComponentCallNow(kNASetControllerSelect,12);
  1320.  
  1321. pascal ComponentResult NASetKnob(NoteAllocator na,
  1322.         NoteChannel noteChannel, long knobNumber,long knobValue)
  1323.          ComponentCallNow(kNASetKnobSelect,12);
  1324.  
  1325.  
  1326. pascal ComponentResult NAFindNoteChannelTone(NoteAllocator na,
  1327.         NoteChannel noteChannel, ToneDescription *td,long *instrumentNumber)
  1328.         ComponentCallNow(kNAFindNoteChannelToneSelect,12);
  1329.  
  1330. pascal ComponentResult NASetNoteChannelInstrument(NoteAllocator na,
  1331.         NoteChannel noteChannel, long instrumentNumber)
  1332.         ComponentCallNow(kNASetNoteChannelInstrumentSelect,8);
  1333.  
  1334.  
  1335. pascal ComponentResult NASendMIDI(NoteAllocator na,
  1336.         NoteChannel noteChannel, MusicMIDIPacket *mp)
  1337.         ComponentCallNow(kNASendMIDISelect,8);
  1338.  
  1339.  
  1340. /*
  1341.  * User Interface
  1342.  */
  1343.  
  1344. pascal ComponentResult NAPickInstrument(NoteAllocator na,
  1345.         ModalFilterUPP filterProc,
  1346.         StringPtr prompt,ToneDescription *sd,
  1347.         unsigned long flags,long refCon,long reserved1,
  1348.         long reserved2)
  1349.         ComponentCallNow(kNAPickInstrumentSelect,28);
  1350.  
  1351. pascal ComponentResult NAStuffToneDescription(NoteAllocator na,
  1352.         long gmNumber,ToneDescription *td)
  1353.         ComponentCallNow(kNAStuffToneDescriptionSelect,8);
  1354.  
  1355. pascal ComponentResult NAPickArrangement(NoteAllocator na,
  1356.         ModalFilterUPP filterProc,
  1357.         StringPtr prompt,
  1358.         long partCount, NoteRequest *noteRequestList,
  1359.         Track t,StringPtr songName)
  1360.         ComponentCallNow(kNAPickArrangementSelect,24);
  1361.  
  1362. pascal ComponentResult NACopyrightDialog(NoteAllocator na,
  1363.         PicHandle p,
  1364.         StringPtr author,
  1365.         StringPtr copyright,
  1366.         StringPtr other,
  1367.         StringPtr title,
  1368.         ModalFilterProcPtr filterProc,
  1369.         long refCon)
  1370.         ComponentCallNow(kNACopyrightDialogSelect,28);
  1371.  
  1372. pascal ComponentResult NAPickEditInstrument(NoteAllocator na,
  1373.         ModalFilterUPP filterProc,
  1374.         StringPtr prompt,
  1375.         long refCon,
  1376.         NoteChannel nc,
  1377.         AtomicInstrument ai,long flags)
  1378.         ComponentCallNow(kNAPickEditInstrumentSelect,24);
  1379.  
  1380. /*
  1381.  * Note Allocator interior views
  1382.  */
  1383.  
  1384. struct NAStatPiece {
  1385.     Str31 clientName;
  1386.     Str31 synthesizerName;
  1387.     long part;
  1388.     long midiChannel;
  1389.     long polyphony;
  1390.     long valid;
  1391. };
  1392. typedef struct NAStatPiece NAStatPiece;
  1393.  
  1394. struct NAStat {
  1395.     long pieceCount;
  1396.     NAStatPiece piece[64];
  1397. };
  1398. typedef struct NAStat NAStat;
  1399.  
  1400. pascal ComponentResult NAGetStatusBlock(NoteAllocator na, NAStat *stat)
  1401.         ComponentCallNow(kNAGetStatusBlockSelect,4);
  1402.  
  1403. pascal ComponentResult NAGetIndNoteChannel(NoteAllocator na, long index, NoteChannel *nc)
  1404.         ComponentCallNow(kNAGetIndNoteChannelSelect,8);
  1405.  
  1406.  
  1407. //∑#ifndef forMasterInterfaces
  1408. #endif _NoteAllocator_
  1409. //∑#endif forMasterInterfaces
  1410.  
  1411.  
  1412.  
  1413.  
  1414. //∑#ifndef forMasterInterfaces
  1415.  
  1416. /*
  1417.     File:        TunePlayerComponent.h
  1418.  
  1419.     Copyright:    © 1992-1994 by Apple Computer, Inc., all rights reserved.
  1420.  
  1421.     Change History (most recent first):
  1422.  
  1423.         <25>     9-11-94    dvb        
  1424.         <24+>    GetTunePlayerState
  1425.         <24>     10/3/94    JB        New Universal Interfaces
  1426.         <23>     19-9-94    dvb        looping
  1427.         <22>     7/20/94    dvb        Allow user-assigned note channels, and callout procedure.
  1428.         <21>      6/1/94    dvb        TuneStatus could be cool.
  1429.         <20>     5/29/94    dvb        error code
  1430.         <19>     3/15/94    dvb        Queueflag to .exclude. notes at end of sample
  1431.         <18>      3/6/94    JB        PowerInterfacer sucks && UniversalHeaders changed
  1432.                                     CallComponentNow
  1433.         <17>      3/4/94    JB        .h -> .i
  1434.         <16>      3/4/94    dvb        Dont clip notes at end of sample.
  1435.         <15>     2/14/94    dvb        Remove TuneGetInfo call
  1436.         <14>     1/28/94    dvb        Fix some header inconsistencies.
  1437.         <13>     1/24/94    dvb        Change TuneQueue interface
  1438.         <12>    12/18/93    dvb        Tune header in parseable form.
  1439.         <11>     12/6/93    dvb        TuneGetVolume changes.
  1440.         <10>     8/18/93    dvb        TuneSet/GetVolume (bw)
  1441.         <8+>      8/2/93    dvb        Constant for queuedepth
  1442.         <7+>     6/28/93    dvb        //∑ #ifdef to create public header file.
  1443.          <7>     6/18/93    dvb        Incorporate API review suggestions
  1444.          <6>     9/17/92    dvb        
  1445.          <5>      9/9/92    dvb        Tune segment.
  1446.          <4>      9/7/92    dvb        Scrubbing support.
  1447.          <3>      9/3/92    dvb        Revamp the call set.
  1448.         <1+>     7/24/92    dvb        Volume control from movie controller
  1449.  
  1450.     To Do: Add rate control into TuneQueue
  1451.  
  1452. */
  1453.  
  1454. /*
  1455.     File:        Tune.h
  1456.  
  1457.     Written by:    dvb
  1458.  
  1459.     Copyright:    © 1992 by Apple Computer, Inc., all rights reserved.
  1460.  
  1461.     Change History (most recent first):
  1462. */
  1463.  
  1464. /*
  1465.  * P U B L I C   I N T E R F A C E   F O R   T U N E   P L A Y E R
  1466.  */
  1467.  
  1468.  
  1469.  
  1470. #ifndef _Tune_
  1471. #define _Tune_
  1472.  
  1473.  
  1474. /*--------------------------
  1475.     Inclusions
  1476. --------------------------*/
  1477.  
  1478.  
  1479. //∑#endif forMasterInterfaces
  1480.  
  1481.  
  1482.  
  1483. /*--------------------------
  1484.     Types
  1485. --------------------------*/
  1486.  
  1487. enum {
  1488.     kTuneQueueDepth = 8            /* Deepest you can queue tune segments */
  1489. };
  1490.  
  1491.  
  1492. struct TuneStatus {
  1493.     unsigned long *tune;        /* currently playing tune */
  1494.     unsigned long *tunePtr;        /* position within currently playing piece */
  1495.     TimeValue time;                /* current tune time */
  1496.     short queueCount;            /* how many pieces queued up? */
  1497.     short queueSpots;            /* How many more tunepieces can be queued */
  1498.     TimeValue queueTime;        /* How much time is queued up? (can be very inaccurate) */
  1499.     long reserved[3];
  1500. };
  1501. typedef struct TuneStatus TuneStatus;
  1502.  
  1503. enum {
  1504.     kStopTuneFade = 1,            /* do a quick, synchronous fadeout */
  1505.     kStopTuneSustain = 2,        /* don't silece notes */
  1506.     kStopTuneInstant = 4,        /* silence notes fast (else, decay them) */
  1507.     kStopTuneReleaseChannels = 8 /* afterwards, let the channels go */
  1508. };
  1509.  
  1510. enum {
  1511.     kTuneSelect = 3,
  1512.     kTuneSetHeaderSelect,
  1513.     kTuneGetTimeBaseSelect,
  1514.     kTuneSetTimeScaleSelect,
  1515.     kTuneGetTimeScaleSelect,
  1516.     kTuneGetIndexedNoteChannelSelect,
  1517.     kTuneDummy,
  1518.     kTuneQueueSelect,
  1519.     kTuneInstantSelect,
  1520.     kTuneGetStatusSelect,
  1521.     kTuneStopSelect,
  1522.     kTuneResumeSelect,
  1523.     kTuneFlushSelect,
  1524.     kTuneSetVolumeSelect,
  1525.     kTuneGetVolumeSelect,
  1526.     kTunePrerollSelect,
  1527.     kTuneUnrollSelect,
  1528.     kTuneSetNoteChannelsSelect,
  1529.     kTuneSetPartTransposeSelect,
  1530.     kTuneGetStateSelect,
  1531.     kTuneLastSelector
  1532.     };
  1533.  
  1534. typedef pascal void (*TuneCallBackProcPtr)(const TuneStatus *status, long refCon);
  1535.  
  1536. enum {
  1537.     uppTuneCallBackProcInfo = kPascalStackBased
  1538.         | STACK_ROUTINE_PARAMETER(0, SIZE_CODE(sizeof(TuneStatus *)))
  1539.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
  1540. };
  1541.  
  1542. #if USESROUTINEDESCRIPTORS
  1543. typedef UniversalProcPtr TuneCallBackUPP;
  1544.  
  1545. #define CallTuneCallBackProc(userRoutine, status, refCon)    \
  1546.     CallUniversalProc((UniversalProcPtr)(userRoutine), uppTuneCallBackProcInfo, (status), (refCon))
  1547. #define NewTuneCallBackProc(userRoutine)    \
  1548.     (TuneCallBackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppTuneCallBackProcInfo, GetCurrentISA())
  1549. #else
  1550. typedef TuneCallBackProcPtr TuneCallBackUPP;
  1551.  
  1552. #define CallTuneCallBackProc(userRoutine, status, refCon)    \
  1553.     (*(userRoutine))((status), (refCon))
  1554. #define NewTuneCallBackProc(userRoutine)    \
  1555.     (TuneCallBackUPP)(userRoutine)
  1556. #endif
  1557.  
  1558. typedef pascal void (*TunePlayCallBackProcPtr)(unsigned long *event,long seed,long refCon);
  1559.  
  1560. enum {
  1561.     uppTunePlayCallBackProcInfo = kPascalStackBased
  1562.         | STACK_ROUTINE_PARAMETER(0, SIZE_CODE(sizeof(unsigned long*)))
  1563.         | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
  1564.         | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
  1565. };
  1566.  
  1567. #if USESROUTINEDESCRIPTORS
  1568. typedef UniversalProcPtr TunePlayCallBackUPP;
  1569.  
  1570. #define CallTunePlayCallBackProc(userRoutine, event, seed, refCon)    \
  1571.     CallUniversalProc((UniversalProcPtr)(userRoutine), uppTunePlayCallBackProcInfo, (event), (seed), (refCon))
  1572. #define NewTunePlayCallBackProc(userRoutine)    \
  1573.     (TunePlayCallBackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppTunePlayCallBackProcInfo, GetCurrentISA())
  1574. #else
  1575. typedef TunePlayCallBackProcPtr TunePlayCallBackUPP;
  1576.  
  1577. #define CallTunePlayCallBackProc(userRoutine, event, seed, refCon)    \
  1578.     (*(userRoutine))((event), (seed), (refCon))
  1579. #define NewTunePlayCallBackProc(userRoutine)    \
  1580.     (TunePlayCallBackUPP)(userRoutine)
  1581. #endif
  1582.  
  1583. #pragma UPPSuite emitUPPTypes
  1584.  
  1585. typedef ComponentInstance TunePlayer;
  1586.  
  1587. enum {
  1588.     kMaxTunePlayerParts = 32,
  1589.  
  1590.     kTunePlayerType = 'tune'
  1591. };
  1592.  
  1593. /*--------------------------
  1594.     Prototypes
  1595. --------------------------*/
  1596.  
  1597.  
  1598. pascal ComponentResult TuneSetHeader(TunePlayer tp,
  1599.         unsigned long *header)
  1600.         ComponentCallNow(kTuneSetHeaderSelect,4);
  1601.  
  1602. pascal ComponentResult TuneSetNoteChannels(TunePlayer tp,
  1603.         unsigned long count,NoteChannel *noteChannelList,
  1604.         TunePlayCallBackUPP playCallBackProc,
  1605.         long refCon)
  1606.         ComponentCallNow(kTuneSetNoteChannelsSelect,16);
  1607.  
  1608.  
  1609. pascal ComponentResult TuneSetPartTranspose(TunePlayer tp,
  1610.         unsigned long part,
  1611.         long transpose,
  1612.         long velocityShift)
  1613.         ComponentCallNow(kTuneSetPartTransposeSelect,12);
  1614.  
  1615. pascal ComponentResult TuneGetTimeBase(TunePlayer tp,
  1616.         TimeBase *tb)
  1617.         ComponentCallNow(kTuneGetTimeBaseSelect,4);
  1618.  
  1619. pascal ComponentResult TuneSetTimeScale(TunePlayer tp,
  1620.         TimeScale scale)
  1621.         ComponentCallNow(kTuneSetTimeScaleSelect,4);
  1622.  
  1623. pascal ComponentResult TuneGetTimeScale(TunePlayer tp,
  1624.         TimeScale *scale)
  1625.         ComponentCallNow(kTuneGetTimeScaleSelect,4);
  1626.  
  1627. pascal ComponentResult TuneGetIndexedNoteChannel(TunePlayer tp,
  1628.         long i, NoteChannel *nc)
  1629.         ComponentCallNow(kTuneGetIndexedNoteChannelSelect,8);
  1630.  
  1631.  
  1632. /* Values for when to start. */
  1633. enum {        
  1634.     kTuneStartNow = 1,                    /* start after buffer is implied */
  1635.     kTuneDontClipNotes = 2,                /* allow notes to finish their durations outside sample */
  1636.     kTuneExcludeEdgeNotes = 4,            /* dont play notes that start at end of tune */
  1637.     kTuneQuickStart = 8,                /* Leave all the controllers where they are, ignore start time */
  1638.     kTuneLoopUntil = 16,                /* loop a queued tune if there's nothing else in the queue */
  1639.     kTuneStartNewMaster = 16384
  1640. };
  1641.  
  1642. pascal ComponentResult TuneQueue(TunePlayer tp,
  1643.         unsigned long *tune,
  1644.         Fixed tuneRate,
  1645.         unsigned long tuneStartPosition,
  1646.         unsigned long tuneStopPosition,
  1647.         unsigned long queueFlags,
  1648.         TuneCallBackUPP callBackProc,
  1649.         long refCon)
  1650.         ComponentCallNow(kTuneQueueSelect,28);
  1651.  
  1652. pascal ComponentResult TuneInstant(TunePlayer tp,
  1653.         unsigned long *tune,
  1654.         long tunePosition)
  1655.         ComponentCallNow(kTuneInstantSelect,8);
  1656.  
  1657. pascal ComponentResult TuneGetStatus(TunePlayer tp,
  1658.         TuneStatus *status)
  1659.         ComponentCallNow(kTuneGetStatusSelect,4);
  1660.  
  1661. /* Values for when to start. */
  1662. enum {        
  1663.     kStopSustain = 1,            /* Leaves notes playing, not silent */
  1664.     kStopFadeout = 2            /* Does a synchronous fade-out */
  1665. };
  1666.  
  1667. pascal ComponentResult TuneStop(TunePlayer tp,
  1668.         long stopFlags)
  1669.         ComponentCallNow(kTuneStopSelect,4);
  1670.  
  1671. pascal ComponentResult TuneResume(TunePlayer tp)
  1672.         ComponentCallNow(kTuneResumeSelect,0);
  1673.  
  1674. pascal ComponentResult TuneFlush(TunePlayer tp)
  1675.         ComponentCallNow(kTuneFlushSelect,0);
  1676.  
  1677. pascal ComponentResult TuneSetVolume(TunePlayer tp,
  1678.         Fixed volume)
  1679.         ComponentCallNow(kTuneSetVolumeSelect,4);
  1680.  
  1681. pascal ComponentResult TuneGetVolume(TunePlayer tp)
  1682.         ComponentCallNow(kTuneGetVolumeSelect,0);
  1683.  
  1684. pascal ComponentResult TunePreroll(TunePlayer tp)
  1685.         ComponentCallNow(kTunePrerollSelect,0);
  1686.  
  1687. pascal ComponentResult TuneUnroll(TunePlayer tp)
  1688.         ComponentCallNow(kTuneUnrollSelect,0);
  1689.  
  1690. pascal ComponentResult TuneGetState(TunePlayer tp,
  1691.         TimeValue t,Handle *state)
  1692.         ComponentCallNow(kTuneGetStateSelect,8);
  1693.  
  1694.  
  1695.  
  1696. //∑#ifndef forMasterInterfaces
  1697. #endif _Tune_
  1698. //∑#endif forMasterInterfaces
  1699. //∑#ifndef forMasterInterfaces
  1700. /*
  1701.     File:        MusicMediaHandler.h
  1702.  
  1703.     Contains:    xxx put contents here xxx
  1704.  
  1705.     Written by:    xxx put writers here xxx
  1706.  
  1707.     Copyright:    © 1991-1995 by Apple Computer, Inc., all rights reserved.
  1708.  
  1709.     This file is used in these builds: Warhol
  1710.  
  1711.     Change History (most recent first):
  1712.  
  1713.          <8>     1/20/95    JB        fixes for building master interfaces
  1714.          <7>     10/3/94    JB        New Universal Interfaces
  1715.          <6>     6/13/94    JB        Bump thing version numbers
  1716.          <5>      3/6/94    JB        PowerInterfacer sucks!
  1717.          <4>      3/4/94    dvb        Corrected musicdescription
  1718.          <3>    12/18/93    dvb        General opcodes
  1719.          <2>    12/17/93    dvb        Test
  1720.         <1+>      8/4/93    dvb        ∑∑ for public release thingie
  1721.         <12>     1/18/93    dvb        
  1722.         <12>     1/15/93    dvb        
  1723.         <12>    10/26/92    dvb        Use this file for something.
  1724.        <10+>     5/10/92    dvb        Totally different media handler.
  1725.         <10>    11/21/91    dvb        Bring into the present, November 1991.
  1726.          <9>     7/27/91    JB        Put flags into MusicMediaInfoHeader
  1727.          <8>     7/26/91    dvb        Delegate the hard stuff.
  1728.          <7>     7/25/91    dvb        More like Music.
  1729.          <6>     7/20/91    JB        SampleTable and ChunkCache changes
  1730.          <5>     7/18/91    dvb        Now it does a simple form of Music, really.
  1731.          <4>     7/15/91    MD        compile
  1732.          <3>      7/5/91    dvb        Stuff.
  1733.          <2>      7/2/91    dvb        Make Music component do something.
  1734.  
  1735.     To Do:
  1736. */
  1737.  
  1738.  
  1739. #ifndef _MusicMedia_
  1740. #define _MusicMedia_
  1741.  
  1742. #define kMusicVersion    0x00040001
  1743. #define MusicMediaInfoHeaderAID 'tmhd'
  1744.  
  1745. //∑#endif forMasterInterfaces
  1746.  
  1747. //$$$BEGINMUSICTYPES
  1748.  
  1749. /*--------------------------
  1750.   Music Sample Description
  1751. --------------------------*/
  1752. #if 0
  1753. struct MusicDescription {
  1754.     long    descSize;
  1755.     long    dataFormat;                    /* 'musi' */
  1756.  
  1757.     long    resvd1;
  1758.     short    resvd2;
  1759.     short    dataRefIndex;
  1760.  
  1761.     long     musicFlags;
  1762.     unsigned long headerData[1];        /* variable size! */
  1763.  
  1764. };
  1765. typedef struct MusicDescription MusicDescription;
  1766. typedef MusicDescription *MusicDescriptionPtr;
  1767. typedef MusicDescriptionPtr *MusicDescriptionHandle;
  1768. #endif
  1769. //$$$ENDMUSICTYPES
  1770.  
  1771. //∑#ifndef forMasterInterfaces
  1772. #endif _MusicMedia_
  1773. //∑#endif forMasterInterfaces
  1774. //∑#ifndef forMasterInterfaces
  1775. /*
  1776.     File:        MusicTrackEvent.h
  1777.  
  1778.     Contains:    QuickTime Music Track Event defines
  1779.  
  1780.     Written by:    Tim Schaaff
  1781.  
  1782.     Copyright:    © 1992-1995 by Apple Computer, Inc., all rights reserved.
  1783.  
  1784.     This file is used in these builds: Warhol
  1785.  
  1786.     Change History (most recent first):
  1787.  
  1788.         <13>     6/14/95    JB        first installment of new AtomicInstruments
  1789.         <12>     6/10/95    dvb        rename the macro "instrument" to "part"
  1790.         <11>     11-4-95    dvb        xcontrol macros never worked
  1791.         <10+>    oh dear, the xcontrol extraction macros never worked, now, did they?
  1792.         <10>     2/16/95    JB        Changed some 1 -> 1L to make 16-bit word people happy
  1793.          <9>     9-11-94    dvb        
  1794.          <8>     10/3/94    JB        New Universal Interfaces
  1795.          <7>      6/4/94    dvb        Embedded Flatinstruments
  1796.          <6>     4/20/94    dvb        Some opcodes.
  1797.          <5>      3/6/94    JB        removed ushort & ulong
  1798.          <4>      3/1/94    dvb        Error with negative control values, add some knob stuffs.
  1799.          <3>     2/15/94    dvb        Fix Stuffproblem on long controller and knobs (thanks, bw!)
  1800.          <2>    12/18/93    dvb        General opcodes
  1801.          <7>     12/6/93    dvb        Make the XNotePitch a single 16 bit field.
  1802.         <5+>      8/4/93    dvb        //∑Public Releasable
  1803.         <4+>      5/8/93    dvb        Long-bugs.
  1804.         <3+>      5/4/93    dvb        More music not midi.
  1805.         <2+>      3/8/93    dvb        Fractions in xnote
  1806.          <1>     6/23/92    TIM        first check in
  1807.  
  1808.     To Do:
  1809. */
  1810.  
  1811. #ifndef __MusicTrackEvent__
  1812. #define __MusicTrackEvent__
  1813.  
  1814. //∑#endif forMasterInterfaces
  1815.  
  1816. typedef unsigned long MusicOpWord, *MusicOpWordPtr;
  1817.  
  1818. /*     QuickTime Music Track Event Formats:
  1819.  
  1820.     At this time, QuickTime music tracks support 5 different event types -- REST events,
  1821.     short NOTE events, short CONTROL events, short GENERAL events, Long NOTE events, 
  1822.     long CONTROL events, and variable GENERAL events.
  1823.  
  1824.         • REST Event (4 bytes/event):
  1825.     
  1826.             (0 0 0) (5-bit UNUSED) (24-bit Rest Duration)
  1827.         
  1828.         • Short NOTE Events (4 bytes/event):
  1829.     
  1830.             (0 0 1) (5-bit Part) (6-bit Pitch) (7-bit Volume) (11-bit Duration)
  1831.         
  1832.             where:    Pitch is offset by 32 (Actual pitch = pitch field + 32)
  1833.  
  1834.         • Short CONTROL Events (4 bytes/event):
  1835.     
  1836.             (0 1 0) (5-bit Part) (8-bit Controller) (1-bit UNUSED) (1-bit Sign) (7-bit MSB) (7-bit LSB)
  1837.                                                                          ( or 15-bit Signed Value)
  1838.         • Short GENERAL Event (4 bytes/event):
  1839.     
  1840.             (0 1 1) (1-bit UNUSED) (12-bit Sub-Type) (16-bit Value)
  1841.     
  1842.         • Long NOTE Events (8 bytes/event):
  1843.     
  1844.             (1 0 0 1) (12-bit Part) (1-bit UNUSED) (7-bit Pitch) (1-bit UNUSED) (7-bit Volume)
  1845.             (1 0) (8-bit UNUSED) (22-bit Duration)
  1846.         
  1847.         • Long CONTROL Event (8 bytes/event):
  1848.         
  1849.             (1 0 1 0) (12-bit Part) (16-bit Value MSB) 
  1850.             (1 0) (14-bit Controller) (16-bit Value LSB)
  1851.     
  1852.         • Long KNOB Event (8 bytes/event):
  1853.     
  1854.             (1 0 1 1) (12-bit Sub-Type) (16-bit Value MSB)
  1855.             (1 0) (14-bit KNOB) (16-bit Value LSB)
  1856.     
  1857.         • Variable GENERAL Length Events (N bytes/event):
  1858.     
  1859.             (1 1 1 1) (12-bit Sub-Type) (16-bit Length)
  1860.                 :
  1861.             (32-bit Data values)
  1862.                 :
  1863.             (1 1) (14-bit UNUSED) (16-bit Length)
  1864.     
  1865.             where:    Length field is the number of LONG words in the record.
  1866.                     Lengths include the first and last long words (Minimum length = 2)
  1867.                 
  1868.     The following event type values have not been used yet and are reserved for 
  1869.     future expansion:
  1870.         
  1871.         • (1 0 0 0)        (8 bytes/event)
  1872.         • (1 1 0 0)        (N bytes/event)
  1873.         • (1 1 0 1)        (N bytes/event)
  1874.         • (1 1 1 0)        (N bytes/event)
  1875.         
  1876.     For all events, the following generalizations apply:
  1877.     
  1878.         -    All duration values are specified in Millisecond units.
  1879.         -     Pitch values are intended to map directly to the MIDI key numbers.
  1880.         -    Controllers from 0 to 127 correspond to the standard MIDI controllers.
  1881.             Controllers greater than 127 correspond to other controls (i.e., Pitch Bend, 
  1882.             Key Pressure, and Channel Pressure).    
  1883. */
  1884.  
  1885.  
  1886. // Defines for the implemented music event data fields
  1887. enum {
  1888.      kRestEventType                        = 0x0L,    /* lower 3-bits */
  1889.      kNoteEventType                        = 0x1L,    /* lower 3-bits */
  1890.      kControlEventType                    = 0x2L,    /* lower 3-bits */
  1891.      kMarkerEventType                    = 0x3L,    /* lower 3-bits */
  1892.     
  1893.      kUndefined1EventType                = 0x8L,    /* 4-bits */
  1894.      kXNoteEventType                    = 0x9L,    /* 4-bits */
  1895.      kXControlEventType                    = 0xAL,    /* 4-bits */
  1896.      kKnobEventType                        = 0xBL,    /* 4-bits */
  1897.      kUndefined2EventType                = 0xCL,    /* 4-bits */
  1898.      kUndefined3EventType                = 0xDL,    /* 4-bits */
  1899.      kUndefined4EventType                = 0xEL,    /* 4-bits */
  1900.      kGeneralEventType                    = 0xFL,    /* 4-bits */
  1901.     
  1902.     
  1903.      kXEventLengthBits                    = 0x2L,        /* 2 bits: indicates 8-byte event record */
  1904.      kGeneralEventLengthBits            = 0x3L,        /* 2 bits: indicates variable length event record */
  1905.     
  1906.      kEventLen                            = 1L,        /* length of events in long words */
  1907.      kXEventLen                            = 2L,
  1908.      kRestEventLen                        = kEventLen,/* length of events in long words */
  1909.      kNoteEventLen                        = kEventLen,
  1910.      kControlEventLen                    = kEventLen,
  1911.      kMarkerEventLen                    = kEventLen,
  1912.      kXNoteEventLen                        = kXEventLen,
  1913.      kXControlEventLen                    = kXEventLen,
  1914.      kGeneralEventLen                    = kXEventLen,/* 2 or more, however */
  1915.     
  1916.     // Universal Event Defines
  1917.     
  1918.      kEventLengthFieldPos                = 30,        /* by looking at these two bits of the 1st or last word              */
  1919.      kEventLengthFieldWidth                = 2,        /* of an event you can determine the event length                      */
  1920.                                                     /* length field: 0 & 1 => 1 long; 2 => 2 longs; 3 => variable length */
  1921.     
  1922.      kEventTypeFieldPos                    = 29,        /* event type field for short events */
  1923.      kEventTypeFieldWidth                = 3,        /* short type is 3 bits */
  1924.     
  1925.      kXEventTypeFieldPos                = 28,        /* event type field for extended events */
  1926.      kXEventTypeFieldWidth                = 4,        /* extended type is 4 bits */
  1927.     
  1928.      kEventPartFieldPos            = 24,
  1929.      kEventPartFieldWidth            = 5,
  1930.      kXEventPartFieldPos            = 16,        /* in the 1st long word */
  1931.      kXEventPartFieldWidth        = 12,
  1932.     
  1933.     // Rest Events
  1934.     
  1935.      kRestEventDurationFieldPos            = 0,
  1936.      kRestEventDurationFieldWidth        = 24,
  1937.      kRestEventDurationMax                = ((1L << kRestEventDurationFieldWidth) - 1),
  1938.     
  1939.     // Note Events
  1940.     
  1941.      kNoteEventPitchFieldPos            = 18,
  1942.      kNoteEventPitchFieldWidth            = 6,
  1943.      kNoteEventPitchOffset                = 32,        /* add to value in pitch field to get actual pitch */
  1944.     
  1945.      kNoteEventVolumeFieldPos            = 11,
  1946.      kNoteEventVolumeFieldWidth            = 7,
  1947.      kNoteEventVolumeOffset                = 0,        /* add to value in volume field to get actual volume */
  1948.     
  1949.      kNoteEventDurationFieldPos            = 0,
  1950.      kNoteEventDurationFieldWidth        = 11,
  1951.      kNoteEventDurationMax                = ((1L << kNoteEventDurationFieldWidth) - 1),
  1952.     
  1953.      kXNoteEventPitchFieldPos            = 0,        /* in the 1st long word */
  1954.      kXNoteEventPitchFieldWidth            = 16,
  1955.     
  1956.      kXNoteEventDurationFieldPos        = 0,        /* in the 2nd long word */
  1957.      kXNoteEventDurationFieldWidth        = 22,
  1958.      kXNoteEventDurationMax                = ((1L << kXNoteEventDurationFieldWidth) - 1),
  1959.     
  1960.      kXNoteEventVolumeFieldPos            = 22,        /* in the 2nd long word */
  1961.      kXNoteEventVolumeFieldWidth        = 7,
  1962.     
  1963.     // Control Events
  1964.     
  1965.      kControlEventControllerFieldPos    = 16,
  1966.      kControlEventControllerFieldWidth    = 8,
  1967.     
  1968.      kControlEventValueFieldPos            = 0,
  1969.      kControlEventValueFieldWidth        = 16,
  1970.     
  1971.      kXControlEventControllerFieldPos    = 0,        /* in the 2nd long word */
  1972.      kXControlEventControllerFieldWidth    = 16,
  1973.     
  1974.      kXControlEventValueFieldPos        = 0,        /* in the 1st long word */
  1975.      kXControlEventValueFieldWidth        = 16,
  1976.     
  1977.     // Knob Events
  1978.     
  1979.      kKnobEventValueHighFieldPos        = 0,        /* 1st long word */
  1980.      kKnobEventValueHighFieldWidth        = 16,
  1981.     
  1982.      kKnobEventKnobFieldPos                = 16,        /* 2nd long word */
  1983.      kKnobEventKnobFieldWidth            = 14,
  1984.     
  1985.      kKnobEventValueLowFieldPos            = 0,        /* 2nd long word */
  1986.      kKnobEventValueLowFieldWidth        = 16,
  1987.     
  1988.     // Marker Events
  1989.     
  1990.      kMarkerEventSubtypeFieldPos        = 16,
  1991.      kMarkerEventSubtypeFieldWidth        = 8,
  1992.      kMarkerEventValueFieldPos            = 0,
  1993.      kMarkerEventValueFieldWidth        = 16,
  1994.     
  1995.     // General Events
  1996.     
  1997.      kGeneralEventSubtypeFieldPos        = 16,        /* in the last long word */
  1998.      kGeneralEventSubtypeFieldWidth        = 14,
  1999.     
  2000.      kGeneralEventLengthFieldPos        = 0,        /* in the 1st & last long words */
  2001.      kGeneralEventLengthFieldWidth        = 16
  2002. };
  2003.  
  2004.  
  2005.  
  2006. #pragma output c
  2007.  
  2008. // macros for extracting various fields from the QuickTime event records
  2009.  
  2010. #define MASK(bitWidth)                 ((1L << (bitWidth)) - 1)
  2011. #define EXT(val, pos, width)         (((val) >> (pos)) & MASK(width))
  2012.  
  2013. #define _EventLength(x)             ((EXT(x, kEventLengthFieldPos,     \
  2014.                                             kEventLengthFieldWidth) < 2) ? 1 :     \
  2015.                                             ((EXT(x, kEventLengthFieldPos, kEventLengthFieldWidth) == 2) ? 2 : \
  2016.                                             EXT(x, kGeneralEventLengthFieldPos, kGeneralEventLengthFieldWidth)))
  2017. #define _EventType(x)                 ((EXT(x, kEventTypeFieldPos, kEventTypeFieldWidth) > 3) ? EXT(x, kXEventTypeFieldPos, kXEventTypeFieldWidth) : EXT(x, kEventTypeFieldPos, kEventTypeFieldWidth))
  2018.  
  2019. #define _RestDuration(x)              (EXT(x, kRestEventDurationFieldPos, kRestEventDurationFieldWidth))
  2020.  
  2021. #define _Part(x)                     (EXT(x, kEventPartFieldPos, kEventPartFieldWidth))
  2022. #define _XPart(m, l)                 (EXT(m, kXEventPartFieldPos, kXEventPartFieldWidth))
  2023.  
  2024. #define _NotePitch(x)                 (EXT(x, kNoteEventPitchFieldPos, kNoteEventPitchFieldWidth) + kNoteEventPitchOffset)
  2025. #define _NoteVolume(x)                 (EXT(x, kNoteEventVolumeFieldPos, kNoteEventVolumeFieldWidth) + kNoteEventVolumeOffset)
  2026. #define _NoteDuration(x)             (EXT(x, kNoteEventDurationFieldPos, kNoteEventDurationFieldWidth))
  2027. #define _NoteVelocity _NoteVolume
  2028.  
  2029. #define _XNotePitch(m, l)             (EXT(m, kXNoteEventPitchFieldPos, kXNoteEventPitchFieldWidth))
  2030. #define _XNoteVolume(m, l)             (EXT(l, kXNoteEventVolumeFieldPos, kXNoteEventVolumeFieldWidth))
  2031. #define _XNoteDuration(m, l)         (EXT(l, kXNoteEventDurationFieldPos, kXNoteEventDurationFieldWidth))
  2032. #define _XNoteVelocity _XNoteVolume
  2033.  
  2034. #define _ControlController(x)         (EXT(x, kControlEventControllerFieldPos, kControlEventControllerFieldWidth))
  2035. #define _ControlValue(x)             (EXT(x, kControlEventValueFieldPos, kControlEventValueFieldWidth))
  2036.  
  2037. #define _XControlController(m, l)     (EXT(l, kXControlEventControllerFieldPos, kXControlEventControllerFieldWidth))
  2038. #define _XControlValue(m, l)         (EXT(m, kXControlEventValueFieldPos, kXControlEventValueFieldWidth))
  2039.  
  2040. #define _MarkerSubtype(x)        (EXT(x,kMarkerEventSubtypeFieldPos,kMarkerEventSubtypeFieldWidth))
  2041. #define _MarkerValue(x)         (EXT(x, kMarkerEventValueFieldPos, kMarkerEventValueFieldWidth))
  2042.  
  2043. #define _KnobValue(m,l)                ((EXT(m,kKnobEventValueHighFieldPos,kKnobEventValueHighFieldWidth) << 16)    \
  2044.                                     | (EXT(l,kKnobEventValueLowFieldPos,kKnobEventValueLowFieldWidth)))
  2045. #define _KnobKnob(m,l)                (EXT(l,kKnobEventKnobFieldPos,kKnobEventKnobFieldWidth))
  2046.  
  2047. #define _GeneralSubtype(m,l)        (EXT(l,kGeneralEventSubtypeFieldPos,kGeneralEventSubtypeFieldWidth))
  2048. #define _GeneralLength(m,l)           (EXT(m,kGeneralEventLengthFieldPos,kGeneralEventLengthFieldWidth))
  2049.  
  2050. #define _StuffRestEvent(x, duration)                                                                \
  2051.                         x =     (kRestEventType << kEventTypeFieldPos)                                \
  2052.                             |    ((long)(duration) << kRestEventDurationFieldPos)
  2053.  
  2054. #define _StuffNoteEvent(x, part, pitch, volume, duration)                                        \
  2055.                         x =     (kNoteEventType << kEventTypeFieldPos)                                \
  2056.                             |     ((long)(part) << kEventPartFieldPos)                            \
  2057.                             |    (((long)(pitch) - kNoteEventPitchOffset) << kNoteEventPitchFieldPos)        \
  2058.                             |    (((long)(volume) - kNoteEventVolumeOffset) << kNoteEventVolumeFieldPos)    \
  2059.                             |    ((long)(duration) << kNoteEventDurationFieldPos)
  2060.                             
  2061. #define _StuffControlEvent(x, part, control, value)                                            \
  2062.                         x =     (kControlEventType << kEventTypeFieldPos)                            \
  2063.                             |     ((long)(part) << kEventPartFieldPos)                            \
  2064.                             |    ((long)(control) << kControlEventControllerFieldPos)                        \
  2065.                             |    ((long)((value) & MASK(kControlEventValueFieldWidth)) << kControlEventValueFieldPos)
  2066.                             
  2067. #define _StuffXNoteEvent(w1, w2, part, pitch, volume, duration)                                \
  2068.                         w1 =     (kXNoteEventType << kXEventTypeFieldPos)                            \
  2069.                             |    ((long)(part) << kXEventPartFieldPos)                            \
  2070.                             |    ((long)(pitch) << kXNoteEventPitchFieldPos),                                \
  2071.                         w2 =    (kXEventLengthBits << kEventLengthFieldPos)                            \
  2072.                             |    ((long)(duration) << kXNoteEventDurationFieldPos)                    \
  2073.                             |    ((long)(volume) << kXNoteEventVolumeFieldPos)                        \
  2074.                             
  2075. #define _StuffXControlEvent(w1, w2, part, control, value)                                        \
  2076.                         w1 =     (kXControlEventType << kXEventTypeFieldPos)                            \
  2077.                             |    ((long)(part) << kXEventPartFieldPos)                    \
  2078.                             |    ((long)((value) & MASK(kXControlEventValueFieldWidth)) << kXControlEventValueFieldPos),                     \
  2079.                         w2 =    (kXEventLengthBits << kEventLengthFieldPos)                            \
  2080.                             |    ((long)(control) << kXControlEventControllerFieldPos)
  2081.  
  2082. #define _StuffKnobEvent(w1, w2, part, knob, value)                                        \
  2083.                         w1 =    (kKnobEventType << kXEventTypeFieldPos)                            \
  2084.                             |    ((long)(part) << kXEventPartFieldPos)                \
  2085.                             |    ((long)(value >> 16) << kKnobEventValueLowFieldPos),            \
  2086.                         w2 =    (kXEventLengthBits << kEventLengthFieldPos)                        \
  2087.                             |    ((long)(knob) << kKnobEventKnobFieldPos)                        \
  2088.                             |    ((long)(value & 0xFFFF) << kKnobEventValueLowFieldPos)
  2089.  
  2090. #define _StuffGeneralEvent(w1,w2,part,subType,length)                                        \
  2091.                         w1 =    (kGeneralEventType << kXEventTypeFieldPos)                        \
  2092.                             |    ((long)(part) << kXEventPartFieldPos)                \
  2093.                             |    ((long)(length) << kGeneralEventLengthFieldPos),                \
  2094.                         w2 =    (kGeneralEventLengthBits << kEventLengthFieldPos)                \
  2095.                             |    ((long)(subType) << kGeneralEventSubtypeFieldPos)                \
  2096.                             |    ((long)(length) << kGeneralEventLengthFieldPos)
  2097.  
  2098.  
  2099. #pragma output all
  2100.  
  2101. // General Event Defined Types
  2102. enum {
  2103.  kGeneralEventNoteRequest = 1,        /* Encapsulates NoteRequest data structure */
  2104.  kGeneralEventInstrument = 2,        /* Encapsulates poly, typical poly, followed by InstrumentData record */
  2105.  kGeneralEventFlatInstrument = 3,    /* Encapsulates poly, typical poly, followed by FlatInstrument record */
  2106.  kGeneralEventPartKey = 4,
  2107.  kGeneralEventTuneDifference = 5,    /* Contains a standard sequence, with end marker, for the tune difference of a sequence piece */
  2108.  kGeneralEventAtomicInstrument = 6  /* Encapsulates AtomicInstrument record */
  2109. };
  2110.  
  2111.  
  2112.  
  2113. //∑#ifndef forMasterInterfaces
  2114. #endif //__MusicTrackEvent__
  2115. //∑#endif forMasterInterfaces
  2116.